/***************************************************************************
* Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, *
* Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. *
* *
* Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael *
* Chastain, Michael Quan, and Mitchell Tse. *
* *
* In order to use any part of this Merc Diku Mud, you must comply with *
* both the original Diku license in 'license.doc' as well the Merc *
* license in 'license.txt'. In particular, you may not remove either of *
* these copyright notices. *
* *
* Much time and thought has gone into this software and you are *
* benefitting. We hope that you share your changes too. What goes *
* around, comes around. *
***************************************************************************/
/***************************************************************************
* God Wars Mud improvements copyright (C) 1994, 1995, 1996 by Richard *
* Woolcock. This mud is NOT to be copied in whole or in part, or to be *
* run without the permission of Richard Woolcock. Nobody else has *
* permission to authorise the use of this code. *
***************************************************************************/
#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "merc.h"
/*
* Local functions.
*/
void show_disc args( ( CHAR_DATA *ch ) );
void do_mindblast( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
char arg [MAX_INPUT_LENGTH];
int damage;
argument = one_argument( argument, arg );
if (IS_NPC(ch)) return;
if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch))
{
send_to_char( "Huh?\n\r", ch );
return;
}
if (get_disc(ch,DISC_AUSPEX) < 8)
{
send_to_char("You require level 8 Auspex to use a Mind Blast.\n\r",ch);
return;
}
if (IS_ITEMAFF(ch, ITEMA_PEACE)) do_majesty(ch,"");
if ( arg[0] == '\0' )
{
send_to_char( "Who do you want to Mind Blast?\n\r", ch );
return;
}
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "They are not here.\n\r", ch );
return;
}
if (victim->position != POS_FIGHTING && victim->hit < victim->max_hit)
{
send_to_char( "Nothing happens.\n\r", ch );
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to use Mind Blast on you.",ch,NULL,victim,TO_VICT);
}
return;
}
if (IS_IMMUNE(victim,IMM_SHIELDED) )
{
send_to_char( "Nothing happens.\n\r", ch );
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to use Mind Blast on you.",ch,NULL,victim,TO_VICT);
}
return;
}
if (is_safe(ch,victim))
{
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to use Mind Blast on you.",ch,NULL,victim,TO_VICT);
}
return;
}
damage = victim->max_hit * 0.1;
act( "A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM );
send_to_char("You clutch your head as your mind seems to explode!\n\r",victim);
act("$n clutches $s head in agony!",victim,NULL,NULL,TO_ROOM);
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just used Mind Blast on you.",ch,NULL,victim,TO_VICT);
}
victim->hit -= damage;
if ((IS_NPC(victim) && victim->hit < 1) ||
(!IS_NPC(victim) && victim->hit < -10))
{
act("$n's body falls limply to the ground.",victim,NULL,NULL,TO_ROOM);
demon_gain(ch,victim);
group_gain(ch,victim);
victim->form = 8;
killperson(ch,victim);
WAIT_STATE( ch, 12 );
return;
}
stop_fighting(victim,TRUE);
update_pos(victim);
if (victim->position > POS_STUNNED)
victim->position = POS_STUNNED;
if (IS_NPC(victim)) do_kill(victim,ch->name);
WAIT_STATE( ch, 12 );
return;
}
void do_willpower( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
char buf[MAX_INPUT_LENGTH];
argument = one_argument( argument, arg );
if ( IS_NPC(ch) )
return;
if (arg[0] == '\0')
{
send_to_char("--------------------------------------------------------------------------------\n\r",ch);
send_to_char(" -= Will Power =-\n\r",ch);
send_to_char("--------------------------------------------------------------------------------\n\r",ch);
if (IS_WILLPOWER(ch, RES_ANIMALISM))
send_to_char("Animalism: You automatically try to resist Beast Within and Song of Serenity.\n\r",ch);
else
send_to_char("Animalism: You don't try to resist Beast Within and Song of Serenity.\n\r",ch);
if (IS_WILLPOWER(ch, RES_AUSPEX))
send_to_char("Auspex: You automatically try to resist Unveil the Shrouded Mind.\n\r",ch);
else
send_to_char("Auspex: You don't try to resist Unveil the Shrouded Mind.\n\r",ch);
if (IS_WILLPOWER(ch, RES_DOMINATE))
send_to_char("Dominate: You automatically try to resist Dominate attempts.\n\r",ch);
else
send_to_char("Dominate: You don't try to resist Dominate attempts.\n\r",ch);
if (IS_WILLPOWER(ch, RES_PRESENCE))
send_to_char("Presence: You automatically try to resist Dread Gaze and Entrancement.\n\r",ch);
else
send_to_char("Presence: You don't try to resist Dread Gaze and Entrancement.\n\r",ch);
if (IS_WILLPOWER(ch, RES_TOGGLE))
send_to_char("Toggle: You automatically keep burning willpower to resist attempts.\n\r",ch);
else
send_to_char("Toggle: You will only burn willpower to resist each first attempt.\n\r",ch);
send_to_char("--------------------------------------------------------------------------------\n\r",ch);
send_to_char("You may change any of the above by typing: willpower <value>\n\r",ch);
send_to_char("--------------------------------------------------------------------------------\n\r",ch);
send_to_char("Remaining resistance in seconds:\n\r", ch );
sprintf( buf,"Animalism: %d. Auspex: %d. Presence: %d. Dominate: %d.\n\r",
ch->pcdata->resist[WILL_ANIMALISM], ch->pcdata->resist[WILL_AUSPEX],
ch->pcdata->resist[WILL_PRESENCE], ch->pcdata->resist[WILL_DOMINATE]);
send_to_char( buf, ch );
send_to_char("--------------------------------------------------------------------------------\n\r",ch);
return;
}
if (!str_cmp(arg,"animalism"))
{
if (IS_WILLPOWER(ch, RES_ANIMALISM))
{
send_to_char("You will no longer try to resist Beast Within and Song of Serenity.\n\r",ch);
REMOVE_BIT(ch->pcdata->resist[0], RES_ANIMALISM);
}
else
{
send_to_char("You will now automatically try to resist Beast Within and Song of Serenity.\n\r",ch);
SET_BIT(ch->pcdata->resist[0], RES_ANIMALISM);
}
}
else if (!str_cmp(arg,"auspex"))
{
if (IS_WILLPOWER(ch, RES_AUSPEX))
{
send_to_char("You will no longer try to resist Unveil the Shrouded Mind.\n\r",ch);
REMOVE_BIT(ch->pcdata->resist[0], RES_AUSPEX);
}
else
{
send_to_char("You will now automatically try to resist Unveil the Shrouded Mind.\n\r",ch);
SET_BIT(ch->pcdata->resist[0], RES_AUSPEX);
}
}
else if (!str_cmp(arg,"dominate"))
{
if (IS_WILLPOWER(ch, RES_DOMINATE))
{
send_to_char("You will no longer try to resist Domination attempts.\n\r",ch);
REMOVE_BIT(ch->pcdata->resist[0], RES_DOMINATE);
}
else
{
send_to_char("You will now automatically try to resist Domination attempts.\n\r",ch);
SET_BIT(ch->pcdata->resist[0], RES_DOMINATE);
}
}
else if (!str_cmp(arg,"presence"))
{
if (IS_WILLPOWER(ch, RES_PRESENCE))
{
send_to_char("You will no longer try to resist Dread Gaze and Entrancement.\n\r",ch);
REMOVE_BIT(ch->pcdata->resist[0], RES_PRESENCE);
}
else
{
send_to_char("You will now automatically try to resist Dread Gaze and Entrancement.\n\r",ch);
SET_BIT(ch->pcdata->resist[0], RES_PRESENCE);
}
}
else if (!str_cmp(arg,"toggle"))
{
if (IS_WILLPOWER(ch, RES_TOGGLE))
{
send_to_char("You will now only burn willpower to resist each first attempt.\n\r",ch);
REMOVE_BIT(ch->pcdata->resist[0], RES_TOGGLE);
}
else
{
send_to_char("You will now automatically keep burning willpower to resist attempts.\n\r",ch);
SET_BIT(ch->pcdata->resist[0], RES_TOGGLE);
}
}
else
{
send_to_char("--------------------------------------------------------------------------------\n\r",ch);
send_to_char(" -= Will Power =-\n\r",ch);
send_to_char("--------------------------------------------------------------------------------\n\r",ch);
if (IS_WILLPOWER(ch, RES_ANIMALISM))
send_to_char("Animalism: You automatically try to resist Beast Within and Song of Serenity.\n\r",ch);
else
send_to_char("Animalism: You don't try to resist Beast Within and Song of Serenity.\n\r",ch);
if (IS_WILLPOWER(ch, RES_AUSPEX))
send_to_char("Auspex: You automatically try to resist Unveil the Shrouded Mind.\n\r",ch);
else
send_to_char("Auspex: You don't try to resist Unveil the Shrouded Mind.\n\r",ch);
if (IS_WILLPOWER(ch, RES_DOMINATE))
send_to_char("Dominate: You automatically try to resist Dominate attempts.\n\r",ch);
else
send_to_char("Dominate: You don't try to resist Dominate attempts.\n\r",ch);
if (IS_WILLPOWER(ch, RES_PRESENCE))
send_to_char("Presence: You automatically try to resist Dread Gaze and Entrancement.\n\r",ch);
else
send_to_char("Presence: You don't try to resist Dread Gaze and Entrancement.\n\r",ch);
if (IS_WILLPOWER(ch, RES_TOGGLE))
send_to_char("Toggle: You automatically keep burning willpower to resist attempts.\n\r",ch);
else
send_to_char("Toggle: You will only burn willpower to resist each first attempt.\n\r",ch);
send_to_char("--------------------------------------------------------------------------------\n\r",ch);
send_to_char("You may change any of the above by typing: willpower <value>\n\r",ch);
send_to_char("--------------------------------------------------------------------------------\n\r",ch);
send_to_char("Remaining resistance in seconds:\n\r", ch );
sprintf( buf,"Animalism: %d. Auspex: %d. Presence: %d. Dominate: %d.\n\r",
ch->pcdata->resist[WILL_ANIMALISM], ch->pcdata->resist[WILL_AUSPEX],
ch->pcdata->resist[WILL_PRESENCE], ch->pcdata->resist[WILL_DOMINATE]);
send_to_char( buf, ch );
send_to_char("--------------------------------------------------------------------------------\n\r",ch);
return;
}
return;
}
void do_changeling( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
char arg [MAX_INPUT_LENGTH];
char buf [MAX_STRING_LENGTH];
argument = one_argument( argument, arg );
if (IS_NPC(ch)) return;
if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch))
{
send_to_char( "Huh?\n\r", ch );
return;
}
if (get_disc(ch,DISC_VICISSITUDE) < 1)
{
send_to_char("You require level 1 Vicissitude to use Changeling.\n\r",ch);
return;
}
if ( arg[0] == '\0' )
{
send_to_char( "Change to look like whom?\n\r", ch );
return;
}
if (IS_AFFECTED(ch,AFF_POLYMORPH) && !IS_VAMPAFF(ch,VAM_DISGUISED))
{
send_to_char( "Not while polymorphed.\n\r", ch );
return;
}
if (IS_POLYAFF(ch,POLY_ZULO))
{
send_to_char( "Not while in Zulo Form.\n\r", ch );
return;
}
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if ( IS_NPC(victim) )
{
send_to_char( "Not on NPC's.\n\r", ch );
return;
}
if ( IS_IMMORTAL(victim) && victim != ch )
{
send_to_char( "You can only change to look like avatars or lower.\n\r", ch );
return;
}
if (victim->sex != ch->sex)
{
send_to_char( "You can only change to look like people of the same sex as you.\n\r", ch );
return;
}
if ( ch == victim )
{
if (!IS_AFFECTED(ch,AFF_POLYMORPH) && !IS_VAMPAFF(ch,VAM_DISGUISED))
{
send_to_char( "You already look like yourself!\n\r", ch );
return;
}
if (!IS_POLYAFF(ch, POLY_CHANGELING))
{
send_to_char( "Nothing happens.\n\r", ch );
return;
}
sprintf(buf,"$n's features twist and distort until $e looks like %s.",ch->name);
act(buf,ch,NULL,NULL,TO_ROOM);
REMOVE_BIT(ch->polyaff, POLY_CHANGELING);
REMOVE_BIT(ch->affected_by, AFF_POLYMORPH);
REMOVE_BIT(ch->vampaff, VAM_DISGUISED);
REMOVE_BIT(ch->extra, EXTRA_VICISSITUDE);
free_string( ch->morph );
ch->morph = str_dup( "" );
act("Your features twist and distort until you looks like $n.",ch,NULL,NULL,TO_CHAR);
return;
}
if (IS_VAMPAFF(ch,VAM_DISGUISED))
{
if (!IS_POLYAFF(ch, POLY_CHANGELING))
{
send_to_char( "Nothing happens.\n\r", ch );
return;
}
act("Your features twist and distort until you looks like $N.",ch,NULL,victim,TO_CHAR);
act("$n's features twist and distort until $e looks like you.",ch,NULL,victim,TO_VICT);
act("$n's features twist and distort until $e looks like $N.",ch,NULL,victim,TO_NOTVICT);
free_string( ch->morph );
ch->morph = str_dup( victim->name );
return;
}
act("Your features twist and distort until you looks like $N.",ch,NULL,victim,TO_CHAR);
act("$n's features twist and distort until $e looks like you.",ch,NULL,victim,TO_VICT);
act("$n's features twist and distort until $e looks like $N.",ch,NULL,victim,TO_NOTVICT);
SET_BIT(ch->polyaff, POLY_CHANGELING);
SET_BIT(ch->affected_by, AFF_POLYMORPH);
SET_BIT(ch->vampaff, VAM_DISGUISED);
SET_BIT(ch->extra, EXTRA_VICISSITUDE);
free_string( ch->morph );
ch->morph = str_dup( victim->name );
return;
}
void do_fleshcraft( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
char arg1 [MAX_INPUT_LENGTH];
char arg2 [MAX_INPUT_LENGTH];
char arg3 [MAX_INPUT_LENGTH];
char buf [MAX_STRING_LENGTH];
one_argument( argument, arg1 );
if (IS_NPC(ch)) return;
if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch))
{
send_to_char( "Huh?\n\r", ch );
return;
}
if (get_disc(ch,DISC_VICISSITUDE) < 2)
{
send_to_char("You require level 2 Vicissitude to use Fleshcraft.\n\r",ch);
return;
}
if ( arg1[0] == '\0' )
{
send_to_char( "Change to look like whom?\n\r", ch );
return;
}
if (!str_cmp(arg1,"mod") || !str_cmp(arg1,"modify"))
{
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
argument = one_argument( argument, arg3 );
if (arg1[0] == '\0' || arg2[0] == '\0' || arg3[0] == '\0')
{
send_to_char("Syntax: Fleshcraft Modify <target> <modification>\n\r",ch);
return;
}
if ( ( victim = get_char_room( ch, arg2 ) ) == NULL )
{
send_to_char( "They are not here.\n\r", ch );
return;
}
if (IS_NPC(victim))
{
send_to_char( "You cannot fleshcraft an unwilling person.\n\r", ch );
return;
}
if (!IS_IMMUNE(victim,IMM_VAMPIRE) && ch != victim)
{
send_to_char( "You cannot fleshcraft an unwilling person.\n\r", ch );
return;
}
if (!str_cmp(arg3,"fins"))
{
if (IS_MOD(victim, MOD_FINS))
{
if (ch == victim)
{
send_to_char("You push your fins back into your body!\n\r",ch);
act("$n pushes $s fins back into $s body!",ch,NULL,NULL,TO_ROOM);
}
else
{
act("You push $N's fins back into $S body!",ch,NULL,victim,TO_CHAR);
act("$n pushes your fins back into your body!",ch,NULL,victim,TO_VICT);
act("$n pushes $N's fins back into $S body!",ch,NULL,victim,TO_NOTVICT);
}
REMOVE_BIT(victim->pcdata->bodymods, MOD_FINS);
}
else
{
if (ch == victim)
{
send_to_char("You pull a pair of fins out of your body!\n\r",ch);
act("$n pulls a pair of fins out of $s body!",ch,NULL,NULL,TO_ROOM);
}
else
{
act("You pull a pair of fins out of $N's body!",ch,NULL,victim,TO_CHAR);
act("$n pulls a pair of fins out of your body!",ch,NULL,victim,TO_VICT);
act("$n pulls a pair of fins out of $N's body!",ch,NULL,victim,TO_NOTVICT);
}
SET_BIT(victim->pcdata->bodymods, MOD_FINS);
}
}
else if (!str_cmp(arg3,"tail"))
{
if (IS_MOD(victim, MOD_TAIL))
{
if (ch == victim)
{
send_to_char("You push your tail back into your body!\n\r",ch);
act("$n pushes $s tail back into $s body!",ch,NULL,NULL,TO_ROOM);
}
else
{
act("You push $N's tail back into $S body!",ch,NULL,victim,TO_CHAR);
act("$n pushes your tail back into your body!",ch,NULL,victim,TO_VICT);
act("$n pushes $N's tail back into $S body!",ch,NULL,victim,TO_NOTVICT);
}
REMOVE_BIT(victim->pcdata->bodymods, MOD_TAIL);
}
else
{
if (ch == victim)
{
send_to_char("You pull a tail out of your backside!\n\r",ch);
act("$n pulls a tail out of $s backside!",ch,NULL,NULL,TO_ROOM);
}
else
{
act("You pull a tail out of $N's backside!",ch,NULL,victim,TO_CHAR);
act("$n pulls a tail out of your backside!",ch,NULL,victim,TO_VICT);
act("$n pulls a tail out of $N's backside!",ch,NULL,victim,TO_NOTVICT);
}
SET_BIT(victim->pcdata->bodymods, MOD_TAIL);
}
}
else if (!str_cmp(arg3,"wings"))
{
if (IS_MOD(victim, MOD_WINGS))
{
if (IS_MOD(victim, MOD_UNFOLDED)) do_wings(victim,"");
if (ch == victim)
{
send_to_char("You push your wings back into your shoulders!\n\r",ch);
act("$n pushes $s wings back into $s shoulders!",ch,NULL,NULL,TO_ROOM);
}
else
{
act("You push $N's wings back into $S shoulders!",ch,NULL,victim,TO_CHAR);
act("$n pushes your wings back into your shoulders!",ch,NULL,victim,TO_VICT);
act("$n pushes $N's wings back into $S shoulders!",ch,NULL,victim,TO_NOTVICT);
}
REMOVE_BIT(victim->pcdata->bodymods, MOD_WINGS);
}
else
{
if (ch == victim)
{
send_to_char("You pull a pair of wings out of your shoulders!\n\r",ch);
act("$n pulls a pair of wings out of $s shoulders!",ch,NULL,NULL,TO_ROOM);
}
else
{
act("You pull a pair of wings out of $N's shoulders!",ch,NULL,victim,TO_CHAR);
act("$n pulls a pair of wings out of your shoulders!",ch,NULL,victim,TO_VICT);
act("$n pulls a pair of wings out of $N's shoulders!",ch,NULL,victim,TO_NOTVICT);
}
SET_BIT(victim->pcdata->bodymods, MOD_WINGS);
}
}
else send_to_char( "You cannot do that.\n\r", ch );
return;
}
if (IS_AFFECTED(ch,AFF_POLYMORPH) && !IS_VAMPAFF(ch,VAM_DISGUISED))
{
send_to_char( "Not while polymorphed.\n\r", ch );
return;
}
if (IS_POLYAFF(ch,POLY_ZULO))
{
send_to_char( "Not while in Zulo Form.\n\r", ch );
return;
}
if ( ( victim = get_char_room( ch, arg1 ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if ( IS_IMMORTAL(victim) && victim != ch )
{
send_to_char( "You cannot disguise yourself as them.\n\r", ch );
return;
}
if ( ch == victim )
{
if (!IS_AFFECTED(ch,AFF_POLYMORPH) && !IS_VAMPAFF(ch,VAM_DISGUISED))
{
send_to_char( "You already look like yourself!\n\r", ch );
return;
}
if (!IS_POLYAFF(ch, POLY_FLESHCRAFT))
{
send_to_char( "Nothing happens.\n\r", ch );
return;
}
sprintf(buf,"$n's features twist and distort until $e looks like %s.",ch->name);
act(buf,ch,NULL,NULL,TO_ROOM);
REMOVE_BIT(ch->polyaff, POLY_FLESHCRAFT);
REMOVE_BIT(ch->affected_by, AFF_POLYMORPH);
REMOVE_BIT(ch->vampaff, VAM_DISGUISED);
REMOVE_BIT(ch->extra, EXTRA_VICISSITUDE);
free_string( ch->morph );
ch->morph = str_dup( "" );
act("Your features twist and distort until you looks like $n.",ch,NULL,NULL,TO_CHAR);
free_string( ch->long_descr );
ch->long_descr = str_dup( "" );
return;
}
if (IS_VAMPAFF(ch,VAM_DISGUISED))
{
if (!IS_POLYAFF(ch, POLY_FLESHCRAFT))
{
send_to_char( "Nothing happens.\n\r", ch );
return;
}
act("Your features twist and distort until you looks like $N.",ch,NULL,victim,TO_CHAR);
act("$n's features twist and distort until $e looks like you.",ch,NULL,victim,TO_VICT);
act("$n's features twist and distort until $e looks like $N.",ch,NULL,victim,TO_NOTVICT);
free_string( ch->morph );
if (IS_NPC(victim))
{
ch->morph = str_dup( victim->short_descr );
free_string( ch->long_descr );
ch->long_descr = str_dup( victim->long_descr );
}
else
{
ch->morph = str_dup( victim->name );
free_string( ch->long_descr );
ch->long_descr = str_dup( "" );
}
return;
}
act("Your features twist and distort until you looks like $N.",ch,NULL,victim,TO_CHAR);
act("$n's features twist and distort until $e looks like you.",ch,NULL,victim,TO_VICT);
act("$n's features twist and distort until $e looks like $N.",ch,NULL,victim,TO_NOTVICT);
SET_BIT(ch->polyaff, POLY_FLESHCRAFT);
SET_BIT(ch->affected_by, AFF_POLYMORPH);
SET_BIT(ch->vampaff, VAM_DISGUISED);
SET_BIT(ch->extra, EXTRA_VICISSITUDE);
free_string( ch->morph );
if (IS_NPC(victim))
{
ch->morph = str_dup( victim->short_descr );
free_string( ch->long_descr );
ch->long_descr = str_dup( victim->long_descr );
}
else
{
ch->morph = str_dup( victim->name );
free_string( ch->long_descr );
ch->long_descr = str_dup( "" );
}
return;
}
void do_bonecraft( CHAR_DATA *ch, char *argument )
{
char buf [MAX_STRING_LENGTH];
char arg1 [MAX_INPUT_LENGTH];
char arg2 [MAX_INPUT_LENGTH];
char arg3 [MAX_INPUT_LENGTH];
CHAR_DATA *victim;
if (IS_NPC(ch)) return;
one_argument( argument, arg1 );
smash_tilde(argument);
if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch))
{
send_to_char( "Huh?\n\r", ch );
return;
}
if (get_disc(ch,DISC_VICISSITUDE) < 3)
{
send_to_char("You require level 3 Vicissitude to use Bonecraft.\n\r",ch);
return;
}
if ( argument[0] == '\0' || arg1[0] == '\0' )
{
send_to_char( "Change to look like whom?\n\r", ch );
return;
}
if (!str_cmp(arg1,"mod") || !str_cmp(arg1,"modify"))
{
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
argument = one_argument( argument, arg3 );
if (arg1[0] == '\0' || arg2[0] == '\0' || arg3[0] == '\0')
{
send_to_char("Syntax: Bonecraft Modify <target> <modification>\n\r",ch);
return;
}
if ( ( victim = get_char_room( ch, arg2 ) ) == NULL )
{
send_to_char( "They are not here.\n\r", ch );
return;
}
if (IS_NPC(victim))
{
send_to_char( "You cannot bonecraft an unwilling person.\n\r", ch );
return;
}
if (!IS_IMMUNE(victim,IMM_VAMPIRE) && ch != victim)
{
send_to_char( "You cannot bonecraft an unwilling person.\n\r", ch );
return;
}
if (!str_cmp(arg3,"tusks"))
{
if (IS_MOD(victim, MOD_TUSKS))
{
if (ch == victim)
{
send_to_char("You push your tusks back into your jaw bone!\n\r",ch);
act("$n pushes $s tusks back $s jaw bone!",ch,NULL,NULL,TO_ROOM);
}
else
{
act("You push $N's tusks back into $S jaw bone!",ch,NULL,victim,TO_CHAR);
act("$n pushes your tusks back into your jaw bone!",ch,NULL,victim,TO_VICT);
act("$n pushes $N's tusks back into $S jaw bone!",ch,NULL,victim,TO_NOTVICT);
}
REMOVE_BIT(victim->pcdata->bodymods, MOD_TUSKS);
}
else
{
if (ch == victim)
{
send_to_char("You pull a pair of tusks out of your jaw bone!\n\r",ch);
act("$n pulls a pair of tusks out of $s jaw bone!",ch,NULL,NULL,TO_ROOM);
}
else
{
act("You pull a pair of tusks out of $N's jaw bone!",ch,NULL,victim,TO_CHAR);
act("$n pulls a pair of tusks out of your jaw bone!",ch,NULL,victim,TO_VICT);
act("$n pulls a pair of tusks out of $N's jaw bone!",ch,NULL,victim,TO_NOTVICT);
}
SET_BIT(victim->pcdata->bodymods, MOD_TUSKS);
}
}
else if (!str_cmp(arg3,"horns"))
{
if (IS_MOD(victim, MOD_HORNS))
{
if (ch == victim)
{
send_to_char("You push your horns back into the bone of your skull!\n\r",ch);
act("$n pushes $s horns back into the bone of $s skull!",ch,NULL,NULL,TO_ROOM);
}
else
{
act("You push $N's horns back into the bone of $S skull!",ch,NULL,victim,TO_CHAR);
act("$n pushes your horns back into the bone of your skull!",ch,NULL,victim,TO_VICT);
act("$n pushes $N's horns back into the bone of $S skull!",ch,NULL,victim,TO_NOTVICT);
}
REMOVE_BIT(victim->pcdata->bodymods, MOD_HORNS);
}
else
{
if (ch == victim)
{
send_to_char("You pull a pair of horns out of the bone of your skull!\n\r",ch);
act("$n pulls a pair of horns out of the bone of $s skull!",ch,NULL,NULL,TO_ROOM);
}
else
{
act("You pull a pair of horns out of the bone of $N's skull!",ch,NULL,victim,TO_CHAR);
act("$n pulls a pair of horns out of the bone of your skull!",ch,NULL,victim,TO_VICT);
act("$n pulls a pair of horns out of the bone of $N's skull!",ch,NULL,victim,TO_NOTVICT);
}
SET_BIT(victim->pcdata->bodymods, MOD_HORNS);
}
}
else if (!str_cmp(arg3,"exoskeleton"))
{
if (IS_MOD(victim, MOD_EXOSKELETON))
{
if (ch == victim)
{
send_to_char("You push your exoskeleton back under your skin!\n\r",ch);
act("$n pushes $s exoskeleton back under $s skin!",ch,NULL,NULL,TO_ROOM);
}
else
{
act("You push $N's exoskeleton back under $S skin!",ch,NULL,victim,TO_CHAR);
act("$n pushes your exoskeleton back under your skin!",ch,NULL,victim,TO_VICT);
act("$n pushes $N's exoskeleton back under $S skin!",ch,NULL,victim,TO_NOTVICT);
}
REMOVE_BIT(victim->pcdata->bodymods, MOD_EXOSKELETON);
}
else
{
if (ch == victim)
{
send_to_char("You pull out an exoskeleton from under your skin!\n\r",ch);
act("$n pulls out an exoskeleton from under $s skin!",ch,NULL,NULL,TO_ROOM);
}
else
{
act("You pull out an exoskeleton from under $N's skin!",ch,NULL,victim,TO_CHAR);
act("$n pulls out an exoskeleton from under your skin!",ch,NULL,victim,TO_VICT);
act("$n pulls out an exoskeleton from under $N's skin!",ch,NULL,victim,TO_NOTVICT);
}
SET_BIT(victim->pcdata->bodymods, MOD_EXOSKELETON);
}
}
else send_to_char( "You cannot do that.\n\r", ch );
return;
}
if ( strlen(argument) > 20 )
{
send_to_char( "Please limit your name to 20 characters or less.\n\r", ch );
return;
}
if ( str_cmp(argument,"self") && !check_parse_name( argument ) )
{
send_to_char( "Illegal name.\n\r", ch );
return;
}
if (is_in(argument,"|kavir*pandora*arioch*trial*"))
{
send_to_char( "Illegal name.\n\r", ch );
return;
}
if (IS_AFFECTED(ch,AFF_POLYMORPH) && !IS_VAMPAFF(ch,VAM_DISGUISED))
{
send_to_char( "Not while polymorphed.\n\r", ch );
return;
}
if (IS_POLYAFF(ch,POLY_ZULO))
{
send_to_char( "Not while in Zulo Form.\n\r", ch );
return;
}
if ( !str_cmp(argument,ch->name) || !str_cmp(argument,"self") )
{
if (!IS_AFFECTED(ch,AFF_POLYMORPH) && !IS_VAMPAFF(ch,VAM_DISGUISED))
{
send_to_char( "You already look like yourself!\n\r", ch );
return;
}
if (!IS_POLYAFF(ch, POLY_BONECRAFT))
{
send_to_char( "Nothing happens.\n\r", ch );
return;
}
sprintf(buf,"$n's features twist and distort until $e looks like %s.",ch->name);
act(buf,ch,NULL,NULL,TO_ROOM);
REMOVE_BIT(ch->polyaff, POLY_BONECRAFT);
REMOVE_BIT(ch->affected_by, AFF_POLYMORPH);
REMOVE_BIT(ch->vampaff, VAM_DISGUISED);
REMOVE_BIT(ch->extra, EXTRA_VICISSITUDE);
free_string( ch->morph );
ch->morph = str_dup( "" );
act("Your features twist and distort until you look like $n.",ch,NULL,NULL,TO_CHAR);
return;
}
if (IS_VAMPAFF(ch,VAM_DISGUISED))
{
if (!IS_POLYAFF(ch, POLY_BONECRAFT))
{
send_to_char( "Nothing happens.\n\r", ch );
return;
}
sprintf(buf,"Your features twist and distort until you look like %s.\n\r",argument);
send_to_char(buf,ch);
sprintf(buf,"$n's features twist and distort until $e looks like %s.",argument);
act(buf,ch,NULL,NULL,TO_ROOM);
free_string( ch->morph );
ch->morph = str_dup( argument );
return;
}
sprintf(buf,"Your features twist and distort until you look like %s.\n\r",argument);
send_to_char(buf,ch);
sprintf(buf,"$n's features twist and distort until $e looks like %s.",argument);
act(buf,ch,NULL,NULL,TO_ROOM);
SET_BIT(ch->polyaff, POLY_BONECRAFT);
SET_BIT(ch->affected_by, AFF_POLYMORPH);
SET_BIT(ch->vampaff, VAM_DISGUISED);
SET_BIT(ch->extra, EXTRA_VICISSITUDE);
free_string( ch->morph );
ch->morph = str_dup( argument );
return;
}
void do_zuloform( CHAR_DATA *ch, char *argument )
{
if (IS_NPC(ch)) return;
if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch))
{
send_to_char("Huh?\n\r",ch);
return;
}
if (get_disc(ch,DISC_VICISSITUDE) < 4)
{
send_to_char("You require level 4 Vicissitude to change into Zulo Form.\n\r",ch);
return;
}
if (IS_AFFECTED(ch,AFF_POLYMORPH) && !IS_VAMPAFF(ch,VAM_DISGUISED))
{
send_to_char( "Not while polymorphed.\n\r", ch );
return;
}
if (IS_POLYAFF(ch,POLY_ZULO))
{
/*
if (IS_MOD(ch, MOD_UNFOLDED) && IS_MOD(ch, MOD_WINGS)) do_wings(ch,"");
*/
free_string( ch->morph );
if (IS_ABOMINATION(ch) && IS_SET(ch->act, PLR_WOLFMAN))
ch->morph = str_dup( "a huge werewolf" );
else
{
ch->morph = str_dup( "" );
REMOVE_BIT(ch->affected_by, AFF_POLYMORPH);
REMOVE_BIT(ch->vampaff, VAM_DISGUISED);
REMOVE_BIT(ch->vampaff, VAM_CLAWS);
}
REMOVE_BIT(ch->vampaff, VAM_NIGHTSIGHT);
REMOVE_BIT(ch->extra, EXTRA_VICISSITUDE);
REMOVE_BIT(ch->polyaff, POLY_ZULO);
/*
REMOVE_BIT(ch->pcdata->bodymods, MOD_WINGS);
*/
send_to_char("Your body shrinks and distorts back to its normal form.\n\r",ch);
if (IS_ABOMINATION(ch) && IS_SET(ch->act, PLR_WOLFMAN))
act("An enormous black hairy monster's body shrinks and distorts into the form of $n.",ch,NULL,NULL,TO_ROOM);
else
act("A huge black monster's body shrinks and distorts into the form of $n.",ch,NULL,NULL,TO_ROOM);
return;
}
if (ch->mounted == IS_RIDING) do_dismount(ch,"");
if (IS_ABOMINATION(ch) && IS_SET(ch->act, PLR_WOLFMAN))
{
send_to_char("Your body grows and distorts into an enormous black hairy monster.\n\r",ch);
act("$n's body grows and distorts into an enormous black hairy monster.",ch,NULL,NULL,TO_ROOM);
}
else
{
send_to_char("Your body grows and distorts into a huge black monster.\n\r",ch);
act("$n's body grows and distorts into a huge black monster.",ch,NULL,NULL,TO_ROOM);
}
SET_BIT(ch->vampaff, VAM_CLAWS);
SET_BIT(ch->vampaff, VAM_NIGHTSIGHT);
SET_BIT(ch->affected_by, AFF_POLYMORPH);
SET_BIT(ch->vampaff, VAM_DISGUISED);
SET_BIT(ch->extra, EXTRA_VICISSITUDE);
SET_BIT(ch->polyaff, POLY_ZULO);
/*
if (get_disc(ch,DISC_VICISSITUDE) > 5)
SET_BIT(ch->pcdata->bodymods, MOD_WINGS);
*/
free_string( ch->morph );
if (IS_ABOMINATION(ch) && IS_SET(ch->act, PLR_WOLFMAN))
ch->morph = str_dup( "an enormous black hairy monster" );
else
ch->morph = str_dup( "a huge black monster" );
return;
}
void do_plasmaform( CHAR_DATA *ch, char *argument )
{
OBJ_DATA *obj;
if (IS_NPC(ch)) return;
if ((!IS_VAMPIRE(ch) && !IS_GHOUL(ch)) || IS_HEAD(ch, LOST_HEAD))
{
send_to_char("Huh?\n\r",ch);
return;
}
if (get_disc(ch,DISC_VICISSITUDE) < 5)
{
send_to_char("You require level 5 Vicissitude to change into Plasma Form.\n\r",ch);
return;
}
if (!IS_MORE(ch, MORE_PLASMA) && IS_AFFECTED(ch,AFF_POLYMORPH))
{
send_to_char("Not from this form.\n\r",ch);
return;
}
if ( ( obj = ch->pcdata->chobj ) != NULL && IS_EXTRA(ch, EXTRA_OSWITCH))
{
ch->pcdata->obj_vnum = 0;
obj->chobj = NULL;
ch->pcdata->chobj = NULL;
REMOVE_BIT(ch->affected_by, AFF_POLYMORPH);
REMOVE_BIT(ch->extra, EXTRA_OSWITCH);
REMOVE_BIT(ch->more, MORE_PLASMA);
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);
if (ch->in_room->vnum == ROOM_VNUM_IN_OBJECT)
{
char_from_room(ch);
char_to_room(ch,get_room_index(ROOM_VNUM_HELL));
}
return;
}
if (IS_AFFECTED(ch,AFF_POLYMORPH))
{
send_to_char( "You cannot do this while polymorphed.\n\r", ch);
return;
}
if ((obj = create_object(get_obj_index(OBJ_VNUM_SPILT_BLOOD),0)) == NULL)
{
send_to_char( "Bug - please inform KaVir.\n\r", ch );
return;
}
if (ch->mounted == IS_RIDING) do_dismount(ch,"");
obj_to_room(obj,ch->in_room);
SET_BIT(obj->quest, QUEST_VANISH);
act("$n transforms into $p and splashes to the ground.",ch,obj,NULL,TO_ROOM);
act("You transform into $p and splash to the ground.",ch,obj,NULL,TO_CHAR);
if (IS_EXTRA(ch, TIED_UP))
{
act("The ropes binding you fall through your liquid form.",ch,NULL,NULL,TO_CHAR);
act("The ropes binding $n fall through $s liquid form.",ch,NULL,NULL,TO_ROOM);
REMOVE_BIT(ch->extra, TIED_UP);
REMOVE_BIT(ch->extra, GAGGED);
REMOVE_BIT(ch->extra, BLINDFOLDED);
}
if (is_affected(ch, gsn_web))
{
act("The webbing entrapping $n falls through $s liquid form.",ch,NULL,NULL,TO_ROOM);
send_to_char("The webbing entrapping you falls through your liquid form.\n\r",ch);
affect_strip(ch, gsn_web);
}
if (IS_AFFECTED(ch, AFF_WEBBED))
{
act("The webbing entrapping $n falls through $s liquid form.",ch,NULL,NULL,TO_ROOM);
send_to_char("The webbing entrapping you falls through your liquid form.\n\r",ch);
REMOVE_BIT(ch->affected_by, AFF_WEBBED);
}
if (is_affected(ch, gsn_tendrils))
{
act("The tendrils of darkness entrapping $n fall through $s liquid form.",ch,NULL,NULL,TO_ROOM);
send_to_char("The tendrils of darkness entrapping you fall through your liquid form.\n\r",ch);
affect_strip(ch, gsn_tendrils);
}
if (IS_AFFECTED(ch, AFF_SHADOW))
{
act("The tendrils of darkness entrapping $n fall through $s liquid form.",ch,NULL,NULL,TO_ROOM);
send_to_char("The tendrils of darkness entrapping you fall through your liquid form.\n\r",ch);
REMOVE_BIT(ch->affected_by, AFF_SHADOW);
}
if (is_affected(ch, gsn_jail))
{
act("The band of water entrapping $n splash to the ground.",ch,NULL,NULL,TO_ROOM);
send_to_char("The bands of water entrapping you splash to the ground.\n\r",ch);
affect_strip(ch, gsn_jail);
}
if (IS_AFFECTED(ch, AFF_JAIL))
{
act("The band of water entrapping $n splash to the ground.",ch,NULL,NULL,TO_ROOM);
send_to_char("The bands of water entrapping you splash to the ground.\n\r",ch);
REMOVE_BIT(ch->affected_by, AFF_JAIL);
}
ch->pcdata->obj_vnum = OBJ_VNUM_SPILT_BLOOD;
obj->chobj = ch;
ch->pcdata->chobj = obj;
SET_BIT(ch->affected_by, AFF_POLYMORPH);
SET_BIT(ch->extra, EXTRA_OSWITCH);
SET_BIT(ch->more, MORE_PLASMA);
free_string(ch->morph);
ch->morph = str_dup(obj->short_descr);
return;
}
void do_portal( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
OBJ_DATA *obj;
char arg [MAX_INPUT_LENGTH];
int duration;
one_argument( argument, arg );
if (IS_NPC(ch)) return;
if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch) && (!IS_DEMON(ch) || IS_ANGEL(ch)))
{
send_to_char("Huh?\n\r",ch);
return;
}
if (get_disc(ch,DISC_DAIMOINON) < 3)
{
send_to_char("You require level 3 Daimoinon to create an Infernal Portal.\n\r",ch);
return;
}
if ( arg[0] == '\0')
{
send_to_char( "Who do you wish to create a portal to?\n\r", ch );
return;
}
victim = get_char_world( ch, arg );
if ( ( victim = get_char_world( ch, arg ) ) == NULL
|| victim == ch
|| victim->in_room == NULL
|| ch->in_room == NULL
|| IS_NPC(victim) )
{
send_to_char( "You failed.\n\r", ch );
return;
}
if ( !IS_IMMUNE(victim, IMM_SUMMON)
|| IS_SET(ch->in_room->room_flags, ROOM_PRIVATE)
|| IS_SET(ch->in_room->room_flags, ROOM_SOLITARY)
|| IS_SET(ch->in_room->room_flags, ROOM_NO_RECALL)
|| IS_SET(victim->in_room->room_flags, ROOM_PRIVATE)
|| IS_SET(victim->in_room->room_flags, ROOM_SOLITARY)
|| IS_SET(victim->in_room->room_flags, ROOM_NO_RECALL)
|| victim->in_room->vnum == ch->in_room->vnum)
{
send_to_char( "You failed.\n\r", ch );
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to create an Infernal Portal to you.",ch,NULL,victim,TO_VICT);
}
return;
}
duration = number_range(2,3) * 15;
obj = create_object( get_obj_index( OBJ_VNUM_PORTAL ), 0 );
obj->value[0] = victim->in_room->vnum;
obj->value[3] = ch->in_room->vnum;
obj->timer = duration;
free_string(obj->short_descr);
obj->short_descr = str_dup("an infernal portal");
free_string(obj->description);
obj->description = str_dup("An infernal portal of burning flames floats here.");
if (IS_AFFECTED(ch,AFF_SHADOWPLANE))
obj->extra_flags = ITEM_SHADOWPLANE;
obj_to_room( obj, ch->in_room );
obj = create_object( get_obj_index( OBJ_VNUM_PORTAL ), 0 );
obj->value[0] = ch->in_room->vnum;
obj->value[3] = victim->in_room->vnum;
obj->timer = duration;
free_string(obj->short_descr);
obj->short_descr = str_dup("an infernal portal");
free_string(obj->description);
obj->description = str_dup("An infernal portal of burning flames floats here.");
if (IS_AFFECTED(victim,AFF_SHADOWPLANE))
obj->extra_flags = ITEM_SHADOWPLANE;
obj_to_room( obj, victim->in_room );
act( "$p bursts from the ground in front of $n.", ch, obj, NULL, TO_ROOM );
act( "$p bursts from the ground appears in front of you.", ch, obj, NULL, TO_CHAR );
act( "$p bursts from the ground appears in front of $n.", victim, obj, NULL, TO_ROOM );
act( "$p bursts from the ground appears in front of you.", ch, obj, victim, TO_VICT );
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just created an Infernal Portal to you.",ch,NULL,victim,TO_VICT);
}
return;
}
void do_soultwist( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
char arg [MAX_INPUT_LENGTH];
int damage;
argument = one_argument( argument, arg );
if (IS_NPC(ch)) return;
if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch) && (!IS_DEMON(ch) || IS_ANGEL(ch)))
{
send_to_char( "Huh?\n\r", ch );
return;
}
if (get_disc(ch,DISC_DAIMOINON) < 5)
{
send_to_char("You require level 5 Daimoinon to use Soul Twist.\n\r",ch);
return;
}
if (IS_ITEMAFF(ch, ITEMA_PEACE)) do_majesty(ch,"");
if ( arg[0] == '\0' )
{
send_to_char( "Who do you wish to use Soul Twist on?\n\r", ch );
return;
}
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "They are not here.\n\r", ch );
return;
}
if ( is_safe(ch, victim) )
{
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to use Soul Twist on you.",ch,NULL,victim,TO_VICT);
}
return;
}
if (!IS_EVIL(ch))
{
send_to_char( "You are not evil enough to use Soul Twist.\n\r", ch );
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to use Soul Twist on you.",ch,NULL,victim,TO_VICT);
}
return;
}
if (victim->alignment < 1)
{
send_to_char( "They are not good enough to use Soul Twist on.\n\r", ch );
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to use Soul Twist on you.",ch,NULL,victim,TO_VICT);
}
return;
}
damage = victim->alignment;
act( "A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM );
send_to_char("You scream in agony as your very soul seems to be torn apart!\n\r",victim);
act("$n clutches $s chest and screams in agony!",victim,NULL,NULL,TO_ROOM);
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just used Soul Twist on you.",ch,NULL,victim,TO_VICT);
}
victim->hit -= damage;
if ((IS_NPC(victim) && victim->hit < 1) ||
(!IS_NPC(victim) && victim->hit < -10))
{
act("$n's body falls limply to the ground.",victim,NULL,NULL,TO_ROOM);
demon_gain(ch,victim);
group_gain(ch,victim);
victim->form = 9;
killperson(ch,victim);
WAIT_STATE( ch, 12 );
return;
}
update_pos(victim);
if (IS_NPC(victim)) do_kill(victim,ch->name);
WAIT_STATE( ch, 12 );
return;
}
void do_curse( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
OBJ_DATA *obj;
char arg [MAX_INPUT_LENGTH];
int critical = number_range(1,4);
argument = one_argument( argument, arg );
if (IS_NPC(ch)) return;
if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch) && (!IS_DEMON(ch) || IS_ANGEL(ch)))
{
send_to_char( "Huh?\n\r", ch );
return;
}
if (get_disc(ch,DISC_DAIMOINON) < 4)
{
send_to_char("You require level 4 Daimoinon to use Curse.\n\r",ch);
return;
}
if (IS_ITEMAFF(ch, ITEMA_PEACE)) do_majesty(ch,"");
if ( arg[0] == '\0' )
{
send_to_char( "Who do you wish to curse?\n\r", ch );
return;
}
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "They are not here.\n\r", ch );
return;
}
if (ch == victim)
{
send_to_char( "Now that would be really silly...\n\r", ch );
return;
}
act( "A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM );
WAIT_STATE( ch, 12 );
if ( is_safe(ch, victim) )
{
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to use Curse on you.",ch,NULL,victim,TO_VICT);
}
return;
}
if (number_percent() > (14 - ch->vampgen)*get_disc(ch,DISC_DAIMOINON))
{
send_to_char("Nothing happens.\n\r",ch);
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to use Curse on you.",ch,NULL,victim,TO_VICT);
}
return;
}
if (critical == 1)
{
if (IS_ARM_L(victim,LOST_ARM))
{
send_to_char( "Nothing happens.\n\r", ch );
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to use Curse on you.",ch,NULL,victim,TO_VICT);
}
return;
}
SET_BIT(victim->loc_hp[2],LOST_ARM);
if (IS_BLEEDING(victim,BLEEDING_HAND_L))
REMOVE_BIT(victim->loc_hp[6],BLEEDING_HAND_L);
send_to_char("Your scream in agony as your left arm falls off!\n\r",victim);
act("$n screams in agony as $s left arm falls off!",victim,NULL,NULL,TO_ROOM);
make_part(victim,"arm");
if (IS_ARM_L(victim,LOST_ARM) && IS_ARM_R(victim,LOST_ARM))
{
if ((obj = get_eq_char( victim, WEAR_ARMS )) != NULL)
take_item(victim,obj);
}
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);
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just used Curse on you.",ch,NULL,victim,TO_VICT);
}
if (IS_NPC(victim)) do_kill(victim,ch->name);
return;
}
else if (critical == 2)
{
if (IS_ARM_R(victim,LOST_ARM))
{
send_to_char( "Nothing happens.\n\r", ch );
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to use Curse on you.",ch,NULL,victim,TO_VICT);
}
return;
}
SET_BIT(victim->loc_hp[3],LOST_ARM);
if (IS_BLEEDING(victim,BLEEDING_HAND_R))
REMOVE_BIT(victim->loc_hp[6],BLEEDING_HAND_R);
send_to_char("Your scream in agony as your right arm falls off!\n\r",victim);
act("$n screams in agony as $s right arm falls off!",victim,NULL,NULL,TO_ROOM);
make_part(victim,"arm");
if (IS_ARM_L(victim,LOST_ARM) && IS_ARM_R(victim,LOST_ARM))
{
if ((obj = get_eq_char( victim, WEAR_ARMS )) != NULL)
take_item(victim,obj);
}
if ((obj = get_eq_char( victim, WEAR_WIELD )) != 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);
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just used Curse on you.",ch,NULL,victim,TO_VICT);
}
if (IS_NPC(victim)) do_kill(victim,ch->name);
return;
}
else if (critical == 3)
{
if (IS_LEG_L(victim,LOST_LEG))
{
send_to_char( "Nothing happens.\n\r", ch );
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to use Curse on you.",ch,NULL,victim,TO_VICT);
}
return;
}
SET_BIT(victim->loc_hp[4],LOST_LEG);
if (IS_BLEEDING(victim,BLEEDING_FOOT_L))
REMOVE_BIT(victim->loc_hp[6],BLEEDING_FOOT_L);
send_to_char("Your scream in agony as your left leg falls off!\n\r",victim);
act("$n screams in agony as $s left leg falls off!",victim,NULL,NULL,TO_ROOM);
make_part(victim,"leg");
if (IS_LEG_L(victim,LOST_LEG) && IS_LEG_R(victim,LOST_LEG))
{
if ((obj = get_eq_char( victim, WEAR_LEGS )) != NULL)
take_item(victim,obj);
}
if ((obj = get_eq_char( victim, WEAR_FEET )) != NULL)
take_item(victim,obj);
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just used Curse on you.",ch,NULL,victim,TO_VICT);
}
if (IS_NPC(victim)) do_kill(victim,ch->name);
return;
}
else if (critical == 4)
{
if (IS_LEG_R(victim,LOST_LEG))
{
send_to_char( "Nothing happens.\n\r", ch );
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to use Curse on you.",ch,NULL,victim,TO_VICT);
}
return;
}
SET_BIT(victim->loc_hp[5],LOST_LEG);
if (IS_BLEEDING(victim,BLEEDING_FOOT_R))
REMOVE_BIT(victim->loc_hp[6],BLEEDING_FOOT_R);
send_to_char("Your scream in agony as your right leg falls off!\n\r",victim);
act("$n screams in agony as $s right leg falls off!",victim,NULL,NULL,TO_ROOM);
make_part(victim,"leg");
if (IS_LEG_L(victim,LOST_LEG) && IS_LEG_R(victim,LOST_LEG))
{
if ((obj = get_eq_char( victim, WEAR_LEGS )) != NULL)
take_item(victim,obj);
}
if ((obj = get_eq_char( victim, WEAR_FEET )) != NULL)
take_item(victim,obj);
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just used Curse on you.",ch,NULL,victim,TO_VICT);
}
if (IS_NPC(victim)) do_kill(victim,ch->name);
return;
}
send_to_char("Nothing happens.\n\r",ch);
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to use Curse on you.",ch,NULL,victim,TO_VICT);
}
return;
}
void do_conditioning( 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_VAMPIRE(ch) && !IS_GHOUL(ch))
{
send_to_char( "Huh?\n\r", ch );
return;
}
if (get_disc(ch,DISC_DOMINATE) < 2)
{
send_to_char("You require level 2 Dominate to use Conditioning.\n\r",ch);
return;
}
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if (ch == victim)
{
send_to_char( "You can't condition yourself!\n\r", ch );
return;
}
if ( IS_NPC(victim) )
{
send_to_char( "Not on NPC's.\n\r", ch );
return;
}
if (is_safe(ch,victim)) return;
if (IS_ITEMAFF(victim, ITEMA_SHADES) || IS_ITEMAFF(ch, ITEMA_SHADES) ||
!can_see(victim,ch))
{
if (!IS_SET(ch->act,PLR_HOLYLIGHT) && get_disc(ch,DISC_DOMINATE) < 6)
{
send_to_char( "You are unable to make eye contact with them.\n\r", ch );
return;
}
}
act("You stare deeply into $N's eyes.",ch,NULL,victim,TO_CHAR);
act("$n stares deeply into $N's eyes.",ch,NULL,victim,TO_NOTVICT);
act("$n stares deeply into your eyes.",ch,NULL,victim,TO_VICT);
if (strlen(victim->pcdata->conding) > 2 &&
!str_cmp(victim->pcdata->conding,ch->name))
{
free_string(victim->pcdata->conding);
victim->pcdata->conding = str_dup( "" );
REMOVE_BIT(victim->more, MORE_LOYAL);
act("You remove $N's conditioning.",ch,NULL,victim,TO_CHAR);
act("$n removes your conditioning.",ch,NULL,victim,TO_VICT);
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just used Conditioning on you.",ch,NULL,victim,TO_VICT);
}
return;
}
if (!IS_NPC(victim) && IS_VAMPIRE(victim) && victim->vampgen < ch->vampgen)
{
act("You shake off $N's attempt to Condition you.",victim,NULL,ch,TO_CHAR);
act("$n shakes off $N's attempt to Condition $m.",victim,NULL,ch,TO_NOTVICT);
act("$n shakes off your attempt to Condition $m.",victim,NULL,ch,TO_VICT);
act("$s mind is too strong to overcome.",victim,NULL,ch,TO_VICT);
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to use Conditioning on you.",ch,NULL,victim,TO_VICT);
}
return;
}
if (!IS_NPC(victim) && victim->pcdata->resist[WILL_DOMINATE] > 0)
{
act("You shake off $N's attempt to Condition you.",victim,NULL,ch,TO_CHAR);
act("$n shakes off $N's attempt to Condition $m.",victim,NULL,ch,TO_NOTVICT);
act("$n shakes off your attempt to Condition $m.",victim,NULL,ch,TO_VICT);
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to use Conditioning on you.",ch,NULL,victim,TO_VICT);
}
return;
}
if (!IS_NPC(victim) && ((victim->pcdata->willpower[0] >= 2 &&
IS_MORE(victim, MORE_LOYAL)) || victim->pcdata->willpower[0] >= 5) &&
strlen(victim->pcdata->conding) > 1)
{
if (IS_MORE(victim, MORE_LOYAL)) victim->pcdata->willpower[0] -= 2;
else victim->pcdata->willpower[0] -= 5;
victim->pcdata->resist[WILL_DOMINATE] = 60;
send_to_char("You burn some willpower to resist Conditioning.\n\r",victim);
act("You shake off $N's attempt to Condition you.",victim,NULL,ch,TO_CHAR);
act("$n shakes off $N's attempt to Condition $m.",victim,NULL,ch,TO_NOTVICT);
act("$n shakes off your attempt to Condition $m.",victim,NULL,ch,TO_VICT);
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to use Conditioning on you.",ch,NULL,victim,TO_VICT);
}
return;
}
if (!IS_NPC(victim) && IS_WILLPOWER(victim, RES_DOMINATE) &&
victim->pcdata->willpower[0] >= 10)
{
victim->pcdata->willpower[0] -= 10;
victim->pcdata->resist[WILL_DOMINATE] = 60;
if (!IS_WILLPOWER(victim, RES_TOGGLE))
REMOVE_BIT(victim->pcdata->resist[0], RES_DOMINATE);
send_to_char("You burn some willpower to resist Conditioning.\n\r",victim);
act("You shake off $N's attempt to Condition you.",victim,NULL,ch,TO_CHAR);
act("$n shakes off $N's attempt to Condition $m.",victim,NULL,ch,TO_NOTVICT);
act("$n shakes off your attempt to Condition $m.",victim,NULL,ch,TO_VICT);
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to use Conditioning on you.",ch,NULL,victim,TO_VICT);
}
return;
}
if (strlen(victim->pcdata->conding) > 1)
{
free_string(victim->pcdata->conding);
victim->pcdata->conding = str_dup( "" );
REMOVE_BIT(victim->more, MORE_LOYAL);
act("You remove $N's conditioning.",ch,NULL,victim,TO_CHAR);
act("$n removes your conditioning.",ch,NULL,victim,TO_VICT);
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just used Conditioning on you.",ch,NULL,victim,TO_VICT);
}
return;
}
free_string(victim->pcdata->conding);
victim->pcdata->conding = str_dup( ch->name );
REMOVE_BIT(victim->more, MORE_LOYAL);
act("You condition $N's mind.",ch,NULL,victim,TO_CHAR);
act("$n conditions your mind.",ch,NULL,victim,TO_VICT);
WAIT_STATE( ch, 12 );
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just used Conditioning on you.",ch,NULL,victim,TO_VICT);
}
return;
}
int true_generation( CHAR_DATA *ch, char *argument )
{
char arg1 [MAX_INPUT_LENGTH];
char arg2 [MAX_INPUT_LENGTH];
char arg3 [MAX_INPUT_LENGTH];
char arg4 [MAX_INPUT_LENGTH];
char arg5 [MAX_INPUT_LENGTH];
char arg6 [MAX_INPUT_LENGTH];
char arg7 [MAX_INPUT_LENGTH];
char arg8 [MAX_INPUT_LENGTH];
char arg9 [MAX_INPUT_LENGTH];
char arg10[MAX_INPUT_LENGTH];
char arg11[MAX_INPUT_LENGTH];
char arg12[MAX_INPUT_LENGTH];
int vampgen = 1;
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
argument = one_argument( argument, arg3 );
argument = one_argument( argument, arg4 );
argument = one_argument( argument, arg5 );
argument = one_argument( argument, arg6 );
argument = one_argument( argument, arg7 );
argument = one_argument( argument, arg8 );
argument = one_argument( argument, arg9 );
argument = one_argument( argument, arg10 );
argument = one_argument( argument, arg11 );
argument = one_argument( argument, arg12 );
if (IS_NPC(ch)) return 0;
if (arg1[0] != '\0') {arg1[0] = UPPER(arg1[0]);vampgen = 2;}
if (arg2[0] != '\0') {arg2[0] = UPPER(arg2[0]);vampgen = 3;}
if (arg3[0] != '\0') {arg3[0] = UPPER(arg3[0]);vampgen = 4;}
if (arg4[0] != '\0') {arg4[0] = UPPER(arg4[0]);vampgen = 5;}
if (arg5[0] != '\0') {arg5[0] = UPPER(arg5[0]);vampgen = 6;}
if (arg6[0] != '\0') {arg6[0] = UPPER(arg6[0]);vampgen = 7;}
if (arg7[0] != '\0') {arg7[0] = UPPER(arg7[0]);vampgen = 8;}
if (arg8[0] != '\0') {arg8[0] = UPPER(arg8[0]);vampgen = 9;}
if (arg9[0] != '\0') {arg9[0] = UPPER(arg9[0]);vampgen = 10;}
if (arg10[0] != '\0') {arg10[0] = UPPER(arg10[0]);vampgen = 11;}
if (arg11[0] != '\0') {arg11[0] = UPPER(arg11[0]);vampgen = 12;}
if (arg12[0] != '\0') {arg12[0] = UPPER(arg12[0]);vampgen = 13;}
return vampgen;
}
void do_status( CHAR_DATA *ch, char *argument )
{
if (IS_NPC(ch)) return;
if (ch->race > 0)
{
send_to_char("You already have a reputation.\n\r",ch);
return;
}
if (ch->race < 0)
{
send_to_char("Your reputation is too bad already.\n\r",ch);
return;
}
if (ch->exp < 1)
{
send_to_char("It costs 1 exp to make yourself Known.\n\r",ch);
return;
}
ch->race = 1;
ch->exp--;
send_to_char("You are now Known.\n\r",ch);
return;
}
void do_tongue( CHAR_DATA *ch, char *argument )
{
char arg [MAX_INPUT_LENGTH];
CHAR_DATA *victim;
OBJ_DATA *obj;
int dam;
int stance;
one_argument( argument, arg );
if (IS_NPC(ch)) return;
if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch))
{
send_to_char( "Huh?\n\r", ch );
return;
}
if (get_disc(ch,DISC_SERPENTIS) < 1)
{
send_to_char("You require level 1 Serpentis to use Tongue of the Serpent.\n\r",ch);
return;
}
if (arg[0] == '\0' && ch->fighting == NULL)
{
send_to_char("Who do you wish to use Tongue of the Serpent on?\n\r",ch);
return;
}
if ( ( victim = ch->fighting ) == NULL )
{
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
if ( ( obj = get_obj_carry( ch, arg ) ) != NULL )
{
if ( obj->item_type != ITEM_WEAPON )
{
send_to_char( "You can only poison weapons with your serpentine tongue.\n\r", ch );
return;
}
if ( obj->value[0] != 0 )
{
send_to_char( "This weapon cannot be poisoned.\n\r", ch );
return;
}
act("You run your long serpentine tongue along $p, poisoning it.",ch,obj,NULL,TO_CHAR);
act("$n runs $s long serpentine tongue along $p, poisoning it.",ch,obj,NULL,TO_ROOM);
obj->level = 5 * get_disc(ch,DISC_SERPENTIS);
obj->value[0] = 53;
return;
}
send_to_char( "They aren't here.\n\r", ch );
return;
}
}
if (IS_ITEMAFF(ch, ITEMA_PEACE)) do_majesty(ch,"");
if (is_safe(ch,victim))
{
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to use Tongue of the Serpent on you.",ch,NULL,victim,TO_VICT);
}
return;
}
WAIT_STATE( ch, 6 );
dam = number_range(10,20);
dam += char_damroll(ch);
if (dam == 0) dam = 1;
if ( !IS_AWAKE(victim) )
dam *= 2;
if ( !IS_NPC(ch) && get_disc(ch,DISC_POTENCE) > 0)
dam += dam * get_disc(ch,DISC_POTENCE) * 0.5;
else if ( !IS_NPC(ch) && (IS_SET(ch->act, PLR_CHAMPION) ||
IS_SET(ch->act, PLR_DEMON)) &&
IS_SET(ch->pcdata->disc[C_POWERS], DEM_MIGHT) )
dam *= 1.5;
if ( !IS_NPC(ch) ) dam = dam + (dam * ((ch->wpn[0]) * 0.01));
/*
if ( !IS_NPC(ch) )
*/
{
stance = ch->stance[0];
if ( IS_STANCE(ch, STANCE_NORMAL) ) dam *= 1.25;
else dam = dambonus(ch,victim,dam,stance);
}
if ( dam <= 0 )
dam = 1;
damage( ch, victim, dam, gsn_tongue );
return;
}
void do_mummify( CHAR_DATA *ch, char *argument )
{
OBJ_DATA *obj;
if (IS_NPC(ch)) return;
if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch))
{
send_to_char("Huh?\n\r",ch);
return;
}
if (get_disc(ch,DISC_SERPENTIS) < 2)
{
send_to_char("You require level 2 Serpentis to Mummify yourself.\n\r",ch);
return;
}
if ( ( obj = ch->pcdata->chobj ) != NULL && IS_EXTRA(ch, EXTRA_OSWITCH))
{
REMOVE_BIT(ch->more, MORE_MUMMIFIED);
ch->pcdata->obj_vnum = 0;
obj->chobj = NULL;
ch->pcdata->chobj = NULL;
REMOVE_BIT(ch->affected_by, AFF_POLYMORPH);
REMOVE_BIT(ch->extra, EXTRA_OSWITCH);
free_string(ch->morph);
ch->morph = str_dup("");
act("$p clambers to $s feet.",ch,obj,NULL,TO_ROOM);
act("Your body unshrivels and returns to normal.",ch,obj,NULL,TO_CHAR);
extract_obj(obj);
if (ch->in_room->vnum == ROOM_VNUM_IN_OBJECT)
{
char_from_room(ch);
char_to_room(ch,get_room_index(ROOM_VNUM_HELL));
}
return;
}
if (IS_AFFECTED(ch,AFF_POLYMORPH))
{
send_to_char( "You cannot do this while polymorphed.\n\r", ch);
return;
}
if ((obj = create_object(get_obj_index(OBJ_VNUM_CORPSE_PC),0)) == NULL)
{
send_to_char( "Bug - please inform KaVir.\n\r", ch );
return;
}
mummify_corpse(ch,obj);
if (ch->mounted == IS_RIDING) do_dismount(ch,"");
obj_to_room(obj,ch->in_room);
SET_BIT(obj->quest, QUEST_VANISH);
act("$n shrivels up and falls to the ground.",ch,NULL,NULL,TO_ROOM);
act("You shrivel up and fall to the ground.",ch,NULL,NULL,TO_CHAR);
ch->pcdata->obj_vnum = OBJ_VNUM_CORPSE_PC;
obj->chobj = ch;
ch->pcdata->chobj = obj;
SET_BIT(ch->more, MORE_MUMMIFIED);
SET_BIT(ch->affected_by, AFF_POLYMORPH);
SET_BIT(ch->extra, EXTRA_OSWITCH);
free_string(ch->morph);
ch->morph = str_dup(obj->short_descr);
return;
}
void mummify_corpse( CHAR_DATA *ch, OBJ_DATA *obj )
{
char buf[MAX_STRING_LENGTH];
if (IS_NPC(ch)) return;
if (obj->pIndexData->vnum != OBJ_VNUM_CORPSE_PC)
{
send_to_char( "Bug - please inform KaVir.\n\r", ch );
return;
}
sprintf(buf, obj->short_descr, ch->name);
free_string(obj->short_descr);
obj->short_descr = str_dup( buf );
sprintf(buf, obj->description, ch->name);
free_string(obj->description);
obj->description = str_dup( buf );
SET_BIT(obj->quest, QUEST_VANISH);
return;
}
void staked_corpse( CHAR_DATA *ch, OBJ_DATA *obj )
{
char buf[MAX_STRING_LENGTH];
if (IS_NPC(ch)) return;
if (obj->pIndexData->vnum != OBJ_VNUM_CORPSE_PC)
{
send_to_char( "Bug - please inform KaVir.\n\r", ch );
return;
}
sprintf(buf, "corpse body %s", ch->name);
free_string(obj->name);
obj->name = str_dup( buf );
sprintf(buf, obj->short_descr, ch->name);
free_string(obj->short_descr);
obj->short_descr = str_dup( buf );
sprintf(buf, "The body of %s is lying here with a stake through its chest.", ch->name);
free_string(obj->description);
obj->description = str_dup( buf );
obj->weight = 150;
obj->wear_flags = ITEM_TAKE;
SET_BIT(obj->quest, QUEST_VANISH);
return;
}
void do_baal( CHAR_DATA *ch, char *argument )
{
AFFECT_DATA af;
int sn, blood, potence, celerity, fortitude;
if (IS_NPC(ch)) return;
if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch))
{
send_to_char( "Huh?\n\r", ch );
return;
}
if (get_disc(ch,DISC_DAIMOINON) < 9)
{
send_to_char("You require level 9 Daimoinon to become Baal's Avatar.\n\r",ch);
return;
}
if (is_affected(ch, gsn_demon))
{
send_to_char("You are already possessed by the spirit of Baal.\n\r",ch);
return;
}
if (get_disc(ch,DISC_POTENCE) < 5)
potence = 5 - get_disc(ch,DISC_POTENCE);
else if (get_disc(ch,DISC_POTENCE) < 10) potence = 1;
else potence = 0;
if (get_disc(ch,DISC_CELERITY) < 5)
celerity = 5 - get_disc(ch,DISC_CELERITY);
else if (get_disc(ch,DISC_CELERITY) < 10) celerity = 1;
else celerity = 0;
if (get_disc(ch,DISC_FORTITUDE) < 5)
fortitude = 5 - get_disc(ch,DISC_FORTITUDE);
else if (get_disc(ch,DISC_FORTITUDE) < 10) fortitude = 1;
else fortitude = 0;
blood = (potence + celerity + fortitude) * 10;
if (blood < 1)
{
send_to_char("The spirit of Baal doesn't answer your call.\n\r",ch);
return;
}
if (ch->blood[0] < blood)
{
send_to_char("You have insufficient blood.\n\r",ch);
return;
}
ch->blood[0] -= blood;
if ( ( sn = skill_lookup( "demonic possession" ) ) < 0 ) return;
af.type = sn;
af.duration = get_disc(ch,DISC_DAIMOINON);
af.bitvector = 0;
if (potence > 0)
{
af.location = APPLY_POTENCE;
af.modifier = potence;
affect_to_char( ch, &af );
}
if (celerity > 0)
{
af.location = APPLY_CELERITY;
af.modifier = celerity;
affect_to_char( ch, &af );
}
if (fortitude > 0)
{
af.location = APPLY_FORTITUDE;
af.modifier = fortitude;
affect_to_char( ch, &af );
}
act( "$n's eyes burn with unholy strength!", ch, NULL, NULL, TO_ROOM );
send_to_char("Your eyes glow as you are infused with some of the power of Baal!\n\r",ch);
WAIT_STATE( ch, 12 );
return;
}
void do_servant( CHAR_DATA *ch, char *argument )
{
char buf [MAX_INPUT_LENGTH];
CHAR_DATA *victim;
AFFECT_DATA af;
int sn;
if (IS_NPC(ch)) return;
if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch))
{
send_to_char( "Huh?\n\r", ch );
return;
}
if (get_disc(ch,DISC_DAIMOINON) < 8)
{
send_to_char("You require level 8 Daimoinon to summon a Demonic Servant.\n\r",ch);
return;
}
if (ch->pcdata->followers > 4)
{
send_to_char("Nothing happens.\n\r",ch);
return;
}
ch->pcdata->followers++;
victim=create_mobile( get_mob_index( MOB_VNUM_GUARDIAN ) );
char_to_room(victim,get_room_index(ROOM_VNUM_DISCONNECTION));
free_string(victim->lord);
victim->lord = str_dup(ch->name);
free_string(victim->name);
victim->name = str_dup("demon servant");
free_string(victim->short_descr);
victim->short_descr = str_dup("a demonic servant");
free_string(victim->long_descr);
victim->long_descr = str_dup("A demonic servant stands here, awaiting orders.\n\r");
victim->sex = 1;
victim->alignment = -1000;
free_string(victim->description);
victim->description = str_dup("He looks extremely powerful.\n\r");
victim->level = 100;
victim->hit = 30000;
victim->max_hit = 30000;
victim->mana = 0;
victim->max_mana = 1000;
victim->move = 1000;
victim->max_move = 1000;
victim->hitroll = char_hitroll(ch) - 20;
victim->damroll = char_damroll(ch) - 20;
victim->armor = char_ac(ch) + 100;
char_from_room(victim);
char_to_room(victim,ch->in_room);
strcpy(buf,"Come forth, creature of darkness, and do my bidding!");
do_say( ch, buf );
send_to_char( "A demon bursts from the ground and bows before you.\n\r",ch );
act( "$N bursts from the ground and bows before $n.", ch, NULL, victim, TO_ROOM );
if ( ( sn = skill_lookup( "guardian" ) ) < 0 )
{
send_to_char( "Bug - please inform KaVir.\n\r", ch );
return;
}
add_follower( victim, ch );
af.type = sn;
af.duration = 6666;
af.location = APPLY_NONE;
af.modifier = 0;
af.bitvector = AFF_CHARM;
affect_to_char( victim, &af );
return;
}
void do_controlbeast( CHAR_DATA *ch, char *argument )
{
char arg [MAX_INPUT_LENGTH];
char buf [MAX_STRING_LENGTH];
int cost = (100 - ch->truebeast);
argument = one_argument( argument, arg );
if (IS_NPC(ch)) return;
if (!IS_VAMPIRE(ch))
{
send_to_char("Huh?\n\r",ch);
return;
}
if (ch->pcdata->wolf > 0)
{
send_to_char("Not while the beast is in control!\n\r",ch);
return;
}
if (ch->beast > 99 || ch->truebeast > 99)
{
send_to_char("The beast has already taken over.\n\r",ch);
return;
}
if (ch->pcdata->diableries[DIAB_EVER] > 0)
{
send_to_char("Those who drink of the hearts blood may not attain Golconda.\n\r",ch);
return;
}
if (ch->beast < 1)
{
send_to_char("But you have already attained Golconda!\n\r",ch);
return;
}
if (ch->truebeast < 1)
{
send_to_char("You are unable to exert any further control over your beast.\n\r",ch);
return;
}
if (ch->practice < cost )
{
sprintf(buf,"You need %d primal to try and control your beast.\n\r",cost);
send_to_char(buf,ch);
return;
}
if (arg[0] == '\0' || str_cmp(arg,"buy"))
{
sprintf(buf,"To lower your beast for the cost of %d primal, type: 'controlbeast buy'.\n\r",cost);
send_to_char(buf,ch);
return;
}
ch->practice -= cost;
ch->truebeast--;
send_to_char("You exert some control over your beast.\n\r",ch);
return;
}
void do_shroudnight( CHAR_DATA *ch, char *argument )
{
char buf [MAX_INPUT_LENGTH];
if (IS_NPC(ch)) return;
if (IS_ABOMINATION(ch))
{
if (get_disc(ch,DISC_OBTENEBRATION) < 1 && get_tribe(ch,TRIBE_UKTENA) < 1)
{
send_to_char("You require either level 1 Uktena or level 1 Obtenebration to summon darkness.\n\r",ch);
return;
}
}
else if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch))
{
if (!IS_WEREWOLF(ch))
{
send_to_char( "Huh?\n\r", ch );
return;
}
if (get_tribe(ch,TRIBE_UKTENA) < 1)
{
send_to_char("You require the level 1 power of the Uktena to call the Shroud of Night.\n\r",ch);
return;
}
}
else if (!IS_WEREWOLF(ch) && get_disc(ch,DISC_OBTENEBRATION) < 1)
{
send_to_char("You require level 1 Obtenebration to use Shroud of Night.\n\r",ch);
return;
}
if (ch->in_room == NULL)
{
send_to_char("Nothing happens.\n\r",ch);
return;
}
if (IS_MORE(ch, MORE_DARKNESS))
{
REMOVE_BIT(ch->more, MORE_DARKNESS);
REMOVE_BIT(ch->in_room->room_flags, ROOM_TOTAL_DARKNESS);
send_to_char("You banish the darkness from the room!\n\r", ch);
act("A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM );
act("$n banishes the darkness from the room!",ch,NULL,NULL,TO_ROOM);
ch->pcdata->darkness = 60;
return;
}
if (IS_SET(ch->in_room->room_flags, ROOM_TOTAL_DARKNESS))
{
send_to_char("The room is already in darkness.\n\r", ch);
return;
}
if (ch->pcdata->darkness > 0)
{
if (ch->pcdata->darkness > 1)
sprintf(buf,"You cannot call upon the Shroud of Night for another %d seconds.\n\r",ch->pcdata->darkness);
else
sprintf(buf,"You cannot call upon the Shroud of Night for another 1 second.\n\r");
send_to_char(buf,ch);
return;
}
SET_BIT(ch->in_room->room_flags, ROOM_TOTAL_DARKNESS);
SET_BIT(ch->more, MORE_DARKNESS);
ch->pcdata->darkness = 60;
send_to_char("You call forth the Shroud of Night to darken the room!\n\r", ch);
act("A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM );
act("The room is filled with darkness!",ch,NULL,NULL,TO_ROOM);
return;
}
void do_silencedeath( CHAR_DATA *ch, char *argument )
{
char buf [MAX_INPUT_LENGTH];
if (IS_NPC(ch)) return;
if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch))
{
send_to_char( "Huh?\n\r", ch );
return;
}
if (get_disc(ch,DISC_QUIETUS) < 1)
{
send_to_char("You require level 1 Quietus to use Silence of Death.\n\r",ch);
return;
}
if (ch->in_room == NULL)
{
send_to_char("Nothing happens.\n\r",ch);
return;
}
if (IS_MORE(ch, MORE_SILENCE))
{
REMOVE_BIT(ch->more, MORE_SILENCE);
REMOVE_BIT(ch->in_room->added_flags, ROOM2_SILENCE);
send_to_char("You banish the silence from the room!\n\r", ch);
act("A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM );
act("The room is no longer silent.",ch,NULL,NULL,TO_ROOM);
ch->pcdata->silence = 60;
return;
}
if (IS_SET(ch->in_room->added_flags, ROOM2_SILENCE))
{
send_to_char("The room is already silent.\n\r", ch);
return;
}
if (ch->pcdata->silence > 0)
{
if (ch->pcdata->silence > 1)
sprintf(buf,"You cannot call upon the Silence of Death for another %d seconds.\n\r",ch->pcdata->silence);
else
sprintf(buf,"You cannot call upon the Silence of Death for another 1 second.\n\r");
send_to_char(buf,ch);
return;
}
SET_BIT(ch->in_room->added_flags, ROOM2_SILENCE);
SET_BIT(ch->more, MORE_SILENCE);
ch->pcdata->silence = 60;
send_to_char("You call forth the Silence of Death!\n\r", ch);
act("A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM );
act("The room suddenly goes completely silent!",ch,NULL,NULL,TO_ROOM);
return;
}
void do_weakness( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
AFFECT_DATA af;
char arg [MAX_INPUT_LENGTH];
int sn;
argument = one_argument( argument, arg );
if (IS_NPC(ch)) return;
if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch))
{
send_to_char( "Huh?\n\r", ch );
return;
}
if (get_disc(ch,DISC_QUIETUS) < 2)
{
send_to_char("You require level 2 Quietus to use Weakness.\n\r",ch);
return;
}
if (IS_ITEMAFF(ch, ITEMA_PEACE)) do_majesty(ch,"");
if (arg[0] == '\0')
{
send_to_char("Who do you wish to use Weakness on?\n\r",ch);
return;
}
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if (ch == victim)
{
send_to_char( "Now that would just be plain stupid...\n\r", ch );
return;
}
if ( ( sn = skill_lookup( "weakness" ) ) < 0 )
{
send_to_char( "Bug - please inform KaVir.\n\r", ch );
return;
}
if ( is_safe(ch, victim) )
{
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to use Weakness on you.",ch,NULL,victim,TO_VICT);
}
return;
}
act( "A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM );
send_to_char("You feel weaker!\n\r",victim);
act("$n looks weaker.",victim,NULL,NULL,TO_ROOM);
af.type = sn;
af.location = APPLY_STR;
af.modifier = 0 - get_disc(ch,DISC_QUIETUS);
af.duration = number_range(1,2);
af.bitvector = 0;
affect_join( victim, &af );
WAIT_STATE( ch, 12 );
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just used Weakness on you.",ch,NULL,victim,TO_VICT);
}
return;
}
void do_infirmity( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
AFFECT_DATA af;
char arg [MAX_INPUT_LENGTH];
int sn;
argument = one_argument( argument, arg );
if (IS_NPC(ch)) return;
if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch))
{
send_to_char( "Huh?\n\r", ch );
return;
}
if (get_disc(ch,DISC_QUIETUS) < 3)
{
send_to_char("You require level 3 Quietus to use Infirmity.\n\r",ch);
return;
}
if (IS_ITEMAFF(ch, ITEMA_PEACE)) do_majesty(ch,"");
if (arg[0] == '\0')
{
send_to_char("Who do you wish to use Infirmity on?\n\r",ch);
return;
}
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if (ch == victim)
{
send_to_char( "Now that would just be plain stupid...\n\r", ch );
return;
}
if ( is_safe(ch, victim) )
{
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to use Infirmity on you.",ch,NULL,victim,TO_VICT);
}
return;
}
if ( ( sn = skill_lookup( "weakness" ) ) < 0 )
{
send_to_char( "Bug - please inform KaVir.\n\r", ch );
return;
}
act( "A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM );
send_to_char("You feel weaker!\n\r",victim);
send_to_char("You feel slower!\n\r",victim);
send_to_char("You feel less healthy!\n\r",victim);
act("$n looks weaker.",victim,NULL,NULL,TO_ROOM);
act("$n looks slower.",victim,NULL,NULL,TO_ROOM);
act("$n looks less healthy.",victim,NULL,NULL,TO_ROOM);
af.type = sn;
af.location = APPLY_STR;
af.modifier = 0 - get_disc(ch,DISC_QUIETUS);
af.duration = number_range(1,2);
af.bitvector = 0;
affect_join( victim, &af );
if ( ( sn = skill_lookup( "slowness" ) ) < 0 )
{
send_to_char( "Bug - please inform KaVir.\n\r", ch );
return;
}
af.type = sn;
af.location = APPLY_DEX;
af.modifier = 0 - get_disc(ch,DISC_QUIETUS);
af.duration = number_range(1,2);
af.bitvector = 0;
affect_join( victim, &af );
if ( ( sn = skill_lookup( "infirmity" ) ) < 0 )
{
send_to_char( "Bug - please inform KaVir.\n\r", ch );
return;
}
af.type = sn;
af.location = APPLY_CON;
af.modifier = 0 - get_disc(ch,DISC_QUIETUS);
af.duration = number_range(1,2);
af.bitvector = 0;
affect_join( victim, &af );
WAIT_STATE( ch, 12 );
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just used Infirmity on you.",ch,NULL,victim,TO_VICT);
}
return;
}
void do_bloodagony( CHAR_DATA *ch, char *argument )
{
OBJ_DATA *obj;
char arg [MAX_INPUT_LENGTH];
char buf [MAX_INPUT_LENGTH];
argument = one_argument( argument, arg );
if (IS_NPC(ch)) return;
if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch))
{
send_to_char( "Huh?\n\r", ch );
return;
}
if (get_disc(ch,DISC_QUIETUS) < 4)
{
send_to_char("You require level 4 Quietus to use Blood Agony.\n\r",ch);
return;
}
if (ch->pcdata->bpoints > 0)
{
if (ch->pcdata->bpoints > 1)
sprintf(buf,"You cannot use Blood Agony for another %d seconds.\n\r",ch->pcdata->bpoints);
else
sprintf(buf,"You cannot use Blood Agony for another 1 second.\n\r");
send_to_char(buf,ch);
return;
}
if ( ch->blood[BLOOD_CURRENT] < 10 )
{
send_to_char("You have insufficient blood.\n\r",ch);
return;
}
if ( arg[0] == '\0' )
{
send_to_char( "What weapon do you wish to use Blood Agony on?\n\r", ch );
return;
}
if ( ( obj = get_obj_carry( ch, arg ) ) == NULL )
{
send_to_char( "You are not carrying that object.\n\r", ch );
return;
}
if ( obj->item_type != ITEM_WEAPON )
{
send_to_char( "You may only use Blood Agony on a weapon.\n\r", ch );
return;
}
if ( IS_SET(obj->quest, QUEST_BLOODAGONY) )
{
send_to_char( "This weapon is already covered in blood.\n\r", ch );
return;
}
if ( IS_SET(obj->quest, QUEST_BLOODAGONY)
|| IS_SET(obj->quest, QUEST_ARTIFACT)
|| IS_SET(obj->quest, QUEST_RELIC)
|| obj->chobj != NULL )
{
send_to_char("You are unable to smear any blood on this weapon.\n\r",ch);
return;
}
act("You cut open your wrist and smear some blood onto $p.",ch,obj,NULL,TO_CHAR);
act("$n cuts open $s wrist and smears some blood onto $p.",ch,obj,NULL,TO_ROOM);
SET_BIT(obj->quest, QUEST_BLOODAGONY);
ch->blood[BLOOD_CURRENT] -= 10;
ch->pcdata->bpoints = 60;
if ( obj->spectype == 0 || obj->spectype == SITEM_SILVER )
{
SET_BIT(obj->spectype, SITEM_MESSAGE);
free_string(obj->chpoweruse);
obj->chpoweruse = str_dup( "A few drops of blood drip from $p." );
free_string(obj->victpoweruse);
obj->victpoweruse = str_dup( "A few drops of blood drip from $p carried by $n." );
obj->specpower = ch->specpower = get_disc(ch, DISC_QUIETUS) << 2;
}
return;
}
void do_spit( CHAR_DATA *ch, char *argument )
{
char arg [MAX_INPUT_LENGTH];
CHAR_DATA *victim;
OBJ_DATA *obj_lose;
OBJ_DATA *obj_next;
int dam;
int stance;
one_argument( argument, arg );
if (IS_NPC(ch)) return;
if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch))
{
send_to_char( "Huh?\n\r", ch );
return;
}
if (get_disc(ch,DISC_QUIETUS) < 5)
{
send_to_char("You require level 5 Quietus to use Taste of Death.\n\r",ch);
return;
}
if (IS_ITEMAFF(ch, ITEMA_PEACE)) do_majesty(ch,"");
if (arg[0] == '\0' && ch->fighting == NULL)
{
send_to_char("Who do you wish to use Taste of Death on?\n\r",ch);
return;
}
if ( ( victim = ch->fighting ) == NULL )
{
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
}
if (is_safe(ch,victim))
{
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to use Taste of Death on you.",ch,NULL,victim,TO_VICT);
}
return;
}
WAIT_STATE( ch, 6 );
dam = number_range(10,20);
dam += char_damroll(ch);
if (dam == 0) dam = 1;
if ( !IS_AWAKE(victim) )
dam *= 2;
if ( !IS_NPC(ch) && get_disc(ch,DISC_POTENCE) > 0)
dam += dam * get_disc(ch,DISC_POTENCE) * 0.5;
else if ( !IS_NPC(ch) && IS_DEMON(ch) &&
IS_SET(ch->pcdata->disc[C_POWERS], DEM_MIGHT) )
dam *= 1.5;
if ( !IS_NPC(ch) ) dam = dam + (dam * ((ch->wpn[0]) * 0.01));
/*
if ( !IS_NPC(ch) )
*/
{
stance = ch->stance[0];
if ( IS_STANCE(ch, STANCE_NORMAL) ) dam *= 1.25;
else dam = dambonus(ch,victim,dam,stance);
}
if ( dam <= 0 )
dam = 1;
damage( ch, victim, dam, gsn_spit + TYPE_ADD_AGG );
if ( number_percent( ) < get_disc(ch,DISC_QUIETUS) )
{
for (obj_lose = victim->carrying; obj_lose != NULL; obj_lose = obj_next)
{
obj_next = obj_lose->next_content;
if ( number_bits( 2 ) != 0 )
continue;
switch ( obj_lose->item_type )
{
case ITEM_ARMOR:
if ( obj_lose->condition > 0 )
{
act( "$p is pitted and etched!",
victim, obj_lose, NULL, TO_CHAR );
obj_lose->condition -= 25;
if ( obj_lose->condition < 1 )
extract_obj( obj_lose );
}
break;
case ITEM_SCROLL:
case ITEM_WAND:
case ITEM_STAFF:
case ITEM_TRASH:
case ITEM_POTION:
case ITEM_FURNITURE:
case ITEM_FOOD:
case ITEM_BOAT:
case ITEM_PILL:
case ITEM_CORPSE_NPC:
case ITEM_DRINK_CON:
case ITEM_CONTAINER:
act( "$p fumes and dissolves!",
victim, obj_lose, NULL, TO_CHAR );
extract_obj( obj_lose );
break;
}
}
}
return;
}
void do_shadowbody( CHAR_DATA *ch, char *argument )
{
char buf [MAX_STRING_LENGTH];
if (IS_NPC(ch)) return;
if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch))
{
send_to_char("Huh?\n\r",ch);
return;
}
if (get_disc(ch,DISC_OBTENEBRATION) < 3)
{
send_to_char("You require level 3 Obtenebration to transform into your Shadow Body.\n\r",ch);
return;
}
if (IS_AFFECTED(ch, AFF_POLYMORPH))
{
if (IS_POLYAFF(ch, POLY_SHADOW))
{
REMOVE_BIT(ch->polyaff, POLY_SHADOW);
REMOVE_BIT(ch->affected_by, AFF_ETHEREAL);
}
else
{
send_to_char( "You seem to be stuck in this form.\n\r", ch );
return;
}
act( "You transform into human form.", ch, NULL, NULL, TO_CHAR );
act( "$n transforms into human form.", ch, NULL, NULL, TO_ROOM );
REMOVE_BIT(ch->affected_by, AFF_POLYMORPH);
clear_stats(ch);
free_string( ch->morph );
ch->morph = str_dup( "" );
}
else
{
if (ch->stance[0] != -1) do_stance(ch,"");
if (ch->mounted == IS_RIDING) do_dismount(ch,"");
act( "You transform into a black smoke.", ch, NULL, NULL, TO_CHAR );
act( "$n transforms into a black smoke.", ch, NULL, NULL, TO_ROOM );
if (IS_EXTRA(ch, TIED_UP))
{
act("The ropes binding you fall through your ethereal form.",ch,NULL,NULL,TO_CHAR);
act("The ropes binding $n fall through $s ethereal form.",ch,NULL,NULL,TO_ROOM);
REMOVE_BIT(ch->extra, TIED_UP);
REMOVE_BIT(ch->extra, GAGGED);
REMOVE_BIT(ch->extra, BLINDFOLDED);
}
if (is_affected(ch, gsn_web))
{
act("The webbing entrapping $n falls through $s ethereal form.",ch,NULL,NULL,TO_ROOM);
send_to_char("The webbing entrapping you falls through your ethereal form.\n\r",ch);
affect_strip(ch, gsn_web);
}
if (is_affected(ch, gsn_jail))
{
act("The band of water entrapping $n splash to the ground.",ch,NULL,NULL,TO_ROOM);
send_to_char("The bands of water entrapping you splash to the ground.\n\r",ch);
affect_strip(ch, gsn_jail);
}
if (IS_AFFECTED(ch, AFF_JAIL))
{
act("The band of water entrapping $n splash to the ground.",ch,NULL,NULL,TO_ROOM);
send_to_char("The bands of water entrapping you splash to the ground.\n\r",ch);
REMOVE_BIT(ch->affected_by, AFF_JAIL);
}
SET_BIT(ch->polyaff, POLY_SHADOW);
clear_stats(ch);
SET_BIT(ch->affected_by, AFF_POLYMORPH);
SET_BIT(ch->affected_by, AFF_ETHEREAL);
sprintf(buf, "%s the black smoke", ch->name);
free_string( ch->morph );
ch->morph = str_dup( buf );
}
return;
}
void do_arms( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
char arg [MAX_INPUT_LENGTH];
int sn;
int level;
int spelltype;
argument = one_argument( argument, arg );
if (IS_NPC(ch)) return;
if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch))
{
send_to_char("Huh?\n\r",ch);
return;
}
if (get_disc(ch,DISC_OBTENEBRATION) < 2)
{
send_to_char("You require level 2 Obtenebration to use Arms of the Abyss.\n\r",ch);
return;
}
if (IS_ITEMAFF(ch, ITEMA_PEACE)) do_majesty(ch,"");
if (arg[0] == '\0' && ch->fighting == NULL)
{
send_to_char("Who do you wish to use the Arms of the Abyss on?\n\r",ch);
return;
}
if ( ( victim = ch->fighting ) == NULL )
{
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
}
if ( ch == victim )
{
if (is_affected(ch, gsn_tendrils))
{
act("The tendrils of darkness entrapping $n fall away.",ch,NULL,NULL,TO_ROOM);
send_to_char("The tendrils of darkness entrapping you fall away.\n\r",ch);
affect_strip(ch, gsn_tendrils);
}
else if (IS_AFFECTED(ch, AFF_SHADOW))
{
act("The tendrils of darkness entrapping $n fall away.",ch,NULL,NULL,TO_ROOM);
send_to_char("The tendrils of darkness entrapping you fall away.\n\r",ch);
REMOVE_BIT(ch->affected_by, AFF_SHADOW);
}
else send_to_char( "Nothing happens.\n\r", ch );
return;
}
if ( IS_AFFECTED(victim, AFF_ETHEREAL) )
{
send_to_char( "You cannot use Arms of the Abyss on an ethereal person.\n\r", ch );
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to use Arms of the Abyss on you.",ch,NULL,victim,TO_VICT);
}
return;
}
if (is_safe(ch,victim))
{
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to use Arms of the Abyss on you.",ch,NULL,victim,TO_VICT);
}
return;
}
if ( ( sn = skill_lookup( "tendrils" ) ) < 0 ) return;
spelltype = skill_table[sn].target;
level = get_disc(ch,DISC_OBTENEBRATION) * 5;
(*skill_table[sn].spell_fun) ( sn, level, ch, victim );
WAIT_STATE( ch, 12 );
return;
}
void power_ghoul( CHAR_DATA *ch, CHAR_DATA *victim )
{
int sn, disc;
bool enhanced = FALSE;
bool gain_disc;
if ( IS_NPC(ch) || IS_NPC(victim) || !IS_HERO(victim) || !IS_VAMPIRE(ch))
return;
if (victim->class == CLASS_NONE) victim->class = CLASS_GHOUL;
else if (victim->class != CLASS_GHOUL) return;
for ( sn = 0; sn <= DISC_MAX; sn++ )
{
gain_disc = TRUE;
switch ( sn )
{
case DISC_ANIMALISM:
case DISC_AUSPEX:
case DISC_CELERITY:
case DISC_DOMINATE:
case DISC_FORTITUDE:
case DISC_OBFUSCATE:
case DISC_POTENCE:
case DISC_PRESENCE:
case DISC_PROTEAN:
case DISC_SERPENTIS:
case DISC_THAUMATURGY:
case DISC_VICISSITUDE:
break;
default:
gain_disc = FALSE;
break;
}
if (!gain_disc) continue;
if (ch->pcdata->powers[sn] > 0)
disc = (1 + ch->pcdata->powers[sn]) * 0.5;
else disc = 0;
if (disc > victim->pcdata->powers[sn])
{
victim->pcdata->powers[sn] = disc;
enhanced = TRUE;
}
}
if (enhanced)
send_to_char("You feel the potency of the blood run through your body.\n\r",victim);
return;
}
void do_lamprey( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
char arg [MAX_INPUT_LENGTH];
int level, dam;
int blood = number_range(1,10);
argument = one_argument( argument, arg );
if (IS_NPC(ch)) return;
if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch))
{
send_to_char("Huh?\n\r",ch);
return;
}
if (get_disc(ch,DISC_OBTENEBRATION) < 4)
{
send_to_char("You require level 4 Obtenebration to Call the Lamprey.\n\r",ch);
return;
}
if (IS_ITEMAFF(ch, ITEMA_PEACE)) do_majesty(ch,"");
if (arg[0] == '\0' && ch->fighting == NULL)
{
send_to_char("Who do you wish to Call the Lamprey on?\n\r",ch);
return;
}
if ( ( victim = ch->fighting ) == NULL )
{
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
}
if ( ch == victim )
{
send_to_char( "That would not be a good idea.\n\r", ch );
return;
}
if ( IS_AFFECTED(victim, AFF_ETHEREAL) )
{
send_to_char( "You cannot Call the Lamprey on an ethereal person.\n\r", ch );
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to use Call the Lamprey on you.",ch,NULL,victim,TO_VICT);
}
return;
}
if (is_safe(ch,victim))
{
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to use Call the Lamprey on you.",ch,NULL,victim,TO_VICT);
}
return;
}
level = get_disc(ch,DISC_OBTENEBRATION) * 5;
dam = blood * get_disc(ch,DISC_OBTENEBRATION) * level;
damage(ch,victim,dam,gsn_tendrils);
if (victim == NULL || victim->position == POS_DEAD) return;
if ( victim->blood[BLOOD_CURRENT] < blood )
blood = victim->blood[BLOOD_CURRENT];
victim->blood[BLOOD_CURRENT] -= blood;
ch->blood[BLOOD_CURRENT] += (blood * victim->blood[BLOOD_POTENCY]);
if (ch->blood[BLOOD_CURRENT] >= ch->blood[BLOOD_POOL])
{
ch->blood[BLOOD_CURRENT] = ch->blood[BLOOD_POOL];
if (IS_VAMPIRE(ch)) send_to_char("Your blood lust is sated.\n\r",ch);
}
if (IS_NPC(victim) || !IS_VAMPIRE(victim))
{
power_ghoul(victim,ch);
if (!IS_NPC(ch) && ch->pcdata->dpoints < (victim->blood[2] * 1000))
{
ch->pcdata->dpoints += (blood * 60);
if (ch->pcdata->dpoints > (victim->blood[2] * 100))
ch->pcdata->dpoints = (victim->blood[2] * 100);
}
if (victim->blood[0] > 0 && victim->blood[0] <= 50)
{
act("$n sways weakly from bloodloss.",victim,NULL,NULL,TO_ROOM);
send_to_char("You feel weak from bloodloss.\n\r",victim);
}
else if (victim->blood[0] < 1)
{
act("$n's body falls limply to the ground.",victim,NULL,NULL,TO_ROOM);
group_gain(ch,victim);
victim->form = 3;
killperson(ch,victim);
WAIT_STATE( ch, 12 );
return;
}
}
if (IS_NPC(victim)) do_kill(victim,ch->name);
WAIT_STATE( ch, 12 );
return;
}
void do_thanatopsis( CHAR_DATA *ch, char *argument )
{
OBJ_DATA *obj;
ROOM_INDEX_DATA *pRoomIndex;
ROOM_INDEX_DATA *location;
char arg[MAX_INPUT_LENGTH];
char buf[MAX_INPUT_LENGTH];
one_argument( argument, arg );
if (IS_NPC(ch)) return;
if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch))
{
send_to_char( "Huh?\n\r", ch );
return;
}
if (get_disc(ch,DISC_NECROMANCY) < 1)
{
send_to_char("You require level 1 Necromancy to perform Thanatopsis on a corpse.\n\r",ch);
return;
}
if ( arg[0] == '\0' )
{
send_to_char( "What do you wish to perform Thanatopsis on?\n\r", ch );
return;
}
if ( ( obj = get_obj_here( ch, arg ) ) == NULL )
{
send_to_char( "You cannot seem to find that object.\n\r", ch );
return;
}
if (obj->item_type != ITEM_CORPSE_NPC && obj->item_type != ITEM_CORPSE_PC)
{
send_to_char( "That isn't a corpse.\n\r", ch );
return;
}
act("You examine $p carefully.",ch,obj,NULL,TO_CHAR);
act("$n examines $p carefully.",ch,obj,NULL,TO_ROOM);
if (strlen(obj->questmaker) < 1 || strlen(obj->questowner) < 1)
{
send_to_char( "You are unable to discover anything about the killer.\n\r", ch );
return;
}
sprintf(buf,"It seems that %s was killed by %s.\n\r",obj->questowner,obj->questmaker);
send_to_char(buf,ch);
if ( ( location = ch->in_room ) == NULL )
{
send_to_char("Bug - Please inform KaVir.\n\r",ch);
return;
}
if ( ( pRoomIndex = get_room_index(obj->specpower) ) == NULL )
{
sprintf(buf,"You are unsure where %s was killed.\n\r",obj->questowner);
send_to_char(buf,ch);
}
else
{
if (location == pRoomIndex)
sprintf(buf,"It seems that %s was killed right here.\n\r", obj->questowner);
else
{
char_from_room(ch);
char_to_room(ch,pRoomIndex);
sprintf(buf,"It seems that %s was killed at %s.\n\r", obj->questowner, ch->in_room->name);
char_from_room(ch);
char_to_room(ch,location);
}
send_to_char(buf,ch);
}
return;
}
void do_spiritgate( CHAR_DATA *ch, char *argument )
{
OBJ_DATA *corpse;
OBJ_DATA *obj;
ROOM_INDEX_DATA *pRoomIndex;
ROOM_INDEX_DATA *location;
char arg [MAX_INPUT_LENGTH];
int duration, destination;
one_argument( argument, arg );
if (IS_NPC(ch)) return;
if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch))
{
send_to_char("Huh?\n\r",ch);
return;
}
if (get_disc(ch,DISC_NECROMANCY) < 3)
{
send_to_char("You require level 3 Necromancy to create a Spirit Gate.\n\r",ch);
return;
}
if ( arg[0] == '\0')
{
send_to_char( "Which corpse do you wish to use to make a Spirit Gate?\n\r", ch );
return;
}
if ( ( corpse = get_obj_here( ch, arg ) ) == NULL )
{
send_to_char( "You cannot seem to find that object.\n\r", ch );
return;
}
if (corpse->item_type == ITEM_CORPSE_PC)
{
send_to_char( "Not on that type of corpse.\n\r", ch );
return;
}
if (corpse->item_type != ITEM_CORPSE_NPC)
{
send_to_char( "That isn't a corpse.\n\r", ch );
return;
}
duration = number_range(2,3) * 15;
if ( ( location = ch->in_room ) == NULL )
{
send_to_char("Bug - Please inform KaVir.\n\r",ch);
return;
}
if ( ( pRoomIndex = get_room_index(corpse->specpower) ) == NULL )
{
send_to_char("Nothing happens.\n\r",ch);
return;
}
if (location == pRoomIndex)
{
send_to_char("Nothing happens.\n\r",ch);
return;
}
destination = ch->in_room->vnum;
obj = create_object( get_obj_index( OBJ_VNUM_PORTAL ), 0 );
obj->value[0] = corpse->specpower;
obj->value[3] = destination;
obj->timer = duration;
free_string(obj->name);
obj->name = str_dup("spirit gate portal");
free_string(obj->short_descr);
obj->short_descr = str_dup("a spirit gate");
free_string(obj->description);
obj->description = str_dup("A glowing spirit gate floats here.");
if (IS_AFFECTED(ch,AFF_SHADOWPLANE))
obj->extra_flags = ITEM_SHADOWPLANE;
obj_to_room( obj, location );
act( "$p shimmers into existance in front of $n.", ch, obj, NULL, TO_ROOM );
act( "$p shimmers into existance in front of you.", ch, obj, NULL, TO_CHAR );
char_from_room(ch);
char_to_room(ch,pRoomIndex);
obj = create_object( get_obj_index( OBJ_VNUM_PORTAL ), 0 );
obj->value[0] = destination;
obj->value[3] = corpse->specpower;
obj->timer = duration;
free_string(obj->name);
obj->name = str_dup("spirit gate portal");
free_string(obj->short_descr);
obj->short_descr = str_dup("a spirit gate");
free_string(obj->description);
obj->description = str_dup("A glowing spirit gate floats here.");
if (IS_AFFECTED(ch,AFF_SHADOWPLANE))
obj->extra_flags = ITEM_SHADOWPLANE;
obj_to_room( obj, ch->in_room );
act( "$p shimmers into existance.", ch, obj, NULL, TO_ROOM );
char_from_room(ch);
char_to_room(ch,location);
act("$p crumbles to dust.",ch,corpse,NULL,TO_CHAR);
act("$n crumbles to dust.",ch,corpse,NULL,TO_ROOM);
extract_obj(corpse);
return;
}
void do_preservation( CHAR_DATA *ch, char *argument )
{
OBJ_DATA *obj;
char arg[MAX_INPUT_LENGTH];
char buf[MAX_INPUT_LENGTH];
one_argument( argument, arg );
if (IS_NPC(ch)) return;
if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch))
{
send_to_char( "Huh?\n\r", ch );
return;
}
if (get_disc(ch,DISC_NECROMANCY) < 2)
{
send_to_char("You require level 2 Necromancy to perform Preservation.\n\r",ch);
return;
}
if ( arg[0] == '\0' )
{
send_to_char( "What do you wish to perform Preservation on?\n\r", ch );
return;
}
if ( ( obj = get_obj_here( ch, arg ) ) == NULL )
{
send_to_char( "You cannot seem to find that object.\n\r", ch );
return;
}
if ( obj->chobj != NULL )
{
send_to_char( "You are unable to preserve it.\n\r", ch );
return;
}
if (obj->item_type == ITEM_CORPSE_PC)
send_to_char( "You cannot preserve that type of corpse.\n\r", ch );
else if (obj->item_type == ITEM_FOOD)
{
act("$p shrivels up.",ch,obj,NULL,TO_CHAR);
act("$p shrivels up.",ch,obj,NULL,TO_ROOM);
if (obj->value[0] > 1) obj->value[0] *= 0.5;
ch->carry_weight -= obj->weight;
if (obj->weight > 1) obj->weight *= 0.5;
ch->carry_weight += obj->weight;
obj->timer = -1;
}
else if (obj->item_type == ITEM_CORPSE_NPC)
{
if (strlen(obj->questowner) < 1)
{
act("You are unable to preserve $p.",ch,obj,NULL,TO_CHAR);
return;
}
if (obj->timer < 1)
{
send_to_char( "It is already preserved.\n\r", ch );
return;
}
act("$p shrivels up.",ch,obj,NULL,TO_CHAR);
act("$p shrivels up.",ch,obj,NULL,TO_ROOM);
free_string(obj->short_descr);
sprintf(buf, "the shriveled up corpse of %s",obj->questowner);
obj->short_descr = str_dup(buf);
free_string(obj->description);
sprintf(buf, "The shriveled up corpse of %s is lying here.",obj->questowner);
obj->description = str_dup(buf);
ch->carry_weight -= obj->weight;
if (obj->weight > 1) obj->weight *= 0.5;
ch->carry_weight += obj->weight;
obj->timer = -1;
}
else
send_to_char( "You cannot preserve that object.\n\r", ch );
return;
}
void do_zombie( CHAR_DATA *ch, char *argument )
{
char arg [MAX_INPUT_LENGTH];
char buf [MAX_STRING_LENGTH];
OBJ_DATA *obj;
OBJ_DATA *obj_content;
OBJ_DATA *obj_next;
CHAR_DATA *victim;
MOB_INDEX_DATA *pMobIndex;
AFFECT_DATA af;
int sn;
one_argument( argument, arg );
if (IS_NPC(ch)) return;
if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch))
{
send_to_char( "Huh?\n\r", ch );
return;
}
if (get_disc(ch,DISC_NECROMANCY) < 5)
{
send_to_char("You require level 5 Necromancy to transform a corpse into a Zombie.\n\r",ch);
return;
}
if (ch->pcdata->necromancy > 0)
{
if (ch->pcdata->necromancy > 1)
sprintf(buf,"You cannot animate a Zombie for another %d seconds.\n\r",ch->pcdata->necromancy);
else
sprintf(buf,"You cannot animate a Zombie for another 1 second.\n\r");
send_to_char(buf,ch);
return;
}
if ( arg[0] == '\0' )
{
send_to_char( "What do you wish to animate as a Zombie?\n\r", ch );
return;
}
if ( ( obj = get_obj_here( ch, arg ) ) == NULL )
{
send_to_char( "You cannot seem to find that object.\n\r", ch );
return;
}
if (obj->item_type != ITEM_CORPSE_NPC)
{
send_to_char( "You cannot animate that as a Zombie.\n\r", ch );
return;
}
if (obj->in_room == NULL)
{
send_to_char( "You better drop it first...don't want the little bugger animating in your pants.\n\r", ch );
return;
}
act( "A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM );
if ( ( pMobIndex = get_mob_index( obj->value[2] ) ) == NULL )
{
send_to_char( "Nothing happens.\n\r", ch );
return;
}
victim = create_mobile( pMobIndex );
if (victim->level > 200) victim->level = 200;
victim->hitroll = victim->level;
victim->damroll = victim->level;
char_to_room(victim,ch->in_room);
sprintf(buf,"The zombie of %s stands here.\n\r",victim->short_descr);
free_string(victim->long_descr);
victim->long_descr = str_dup(buf);
sprintf(buf,"zombie %s",victim->name);
free_string(victim->name);
victim->name = str_dup(buf);
sprintf(buf,"the zombie of %s",victim->short_descr);
free_string(victim->short_descr);
victim->short_descr = str_dup(buf);
act("$n clambers to $s feet.",victim,NULL,NULL,TO_ROOM);
free_string(victim->powertype);
victim->powertype = str_dup("zombie");
for ( obj_content = obj->contains; obj_content != NULL; obj_content = obj_next )
{
obj_next = obj_content->next_content;
obj_from_obj(obj_content);
obj_to_char(obj_content,victim);
}
extract_obj(obj);
do_wear(victim,"all");
ch->pcdata->necromancy = 60;
if (ch->pcdata->followers > 4) return;
free_string(victim->lord);
victim->lord = str_dup(ch->name);
ch->pcdata->followers++;
if ( ( sn = skill_lookup( "charm person" ) ) < 0 )
{
send_to_char( "Bug - please inform KaVir.\n\r", ch );
return;
}
add_follower( victim, ch );
af.type = sn;
af.duration = 5000;
af.location = APPLY_NONE;
af.modifier = 0;
af.bitvector = AFF_CHARM;
affect_to_char( victim, &af );
return;
}
void do_hagswrinkles( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
char arg [MAX_INPUT_LENGTH];
char buf [MAX_STRING_LENGTH];
argument = one_argument( argument, arg );
if (IS_NPC(ch)) return;
if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch))
{
send_to_char( "Huh?\n\r", ch );
return;
}
if (get_disc(ch,DISC_THANATOSIS) < 1)
{
send_to_char("You require level 1 Thanatosis to use Hags Wrinkles.\n\r",ch);
return;
}
if ( arg[0] == '\0' )
{
send_to_char( "Change to look like whom?\n\r", ch );
return;
}
if (IS_AFFECTED(ch,AFF_POLYMORPH) && !IS_VAMPAFF(ch,VAM_DISGUISED))
{
send_to_char( "Not while polymorphed.\n\r", ch );
return;
}
if (IS_POLYAFF(ch,POLY_ZULO))
{
send_to_char( "Not while in Zulo Form.\n\r", ch );
return;
}
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if ( IS_IMMORTAL(victim) && victim != ch )
{
send_to_char( "You cannot disguise yourself as them.\n\r", ch );
return;
}
if ( ch == victim )
{
if (!IS_AFFECTED(ch,AFF_POLYMORPH) && !IS_VAMPAFF(ch,VAM_DISGUISED))
{
send_to_char( "You already look like yourself!\n\r", ch );
return;
}
if (!IS_POLYAFF(ch, POLY_HAGS))
{
send_to_char( "Nothing happens.\n\r", ch );
return;
}
sprintf(buf,"$n's features twist and distort until $e looks like %s.",ch->name);
act(buf,ch,NULL,NULL,TO_ROOM);
REMOVE_BIT(ch->polyaff, POLY_HAGS);
REMOVE_BIT(ch->affected_by, AFF_POLYMORPH);
REMOVE_BIT(ch->vampaff, VAM_DISGUISED);
REMOVE_BIT(ch->extra, EXTRA_VICISSITUDE);
free_string( ch->morph );
ch->morph = str_dup( "" );
act("Your features twist and distort until you looks like $n.",ch,NULL,NULL,TO_CHAR);
free_string( ch->long_descr );
ch->long_descr = str_dup( "" );
return;
}
if (IS_VAMPAFF(ch,VAM_DISGUISED))
{
if (!IS_POLYAFF(ch, POLY_HAGS))
{
send_to_char( "Nothing happens.\n\r", ch );
return;
}
act("Your features twist and distort until you looks like $N.",ch,NULL,victim,TO_CHAR);
act("$n's features twist and distort until $e looks like you.",ch,NULL,victim,TO_VICT);
act("$n's features twist and distort until $e looks like $N.",ch,NULL,victim,TO_NOTVICT);
free_string( ch->morph );
if (IS_NPC(victim))
{
ch->morph = str_dup( victim->short_descr );
free_string( ch->long_descr );
ch->long_descr = str_dup( victim->long_descr );
}
else
{
ch->morph = str_dup( victim->name );
free_string( ch->long_descr );
ch->long_descr = str_dup( "" );
}
return;
}
act("Your features twist and distort until you looks like $N.",ch,NULL,victim,TO_CHAR);
act("$n's features twist and distort until $e looks like you.",ch,NULL,victim,TO_VICT);
act("$n's features twist and distort until $e looks like $N.",ch,NULL,victim,TO_NOTVICT);
SET_BIT(ch->polyaff, POLY_HAGS);
SET_BIT(ch->affected_by, AFF_POLYMORPH);
SET_BIT(ch->vampaff, VAM_DISGUISED);
SET_BIT(ch->extra, EXTRA_VICISSITUDE);
free_string( ch->morph );
if (IS_NPC(victim))
{
ch->morph = str_dup( victim->short_descr );
free_string( ch->long_descr );
ch->long_descr = str_dup( victim->long_descr );
}
else
{
ch->morph = str_dup( victim->name );
free_string( ch->long_descr );
ch->long_descr = str_dup( "" );
}
return;
}
void do_ashes( CHAR_DATA *ch, char *argument )
{
OBJ_DATA *obj;
if (IS_NPC(ch)) return;
if ((!IS_VAMPIRE(ch) && !IS_GHOUL(ch)) || IS_HEAD(ch, LOST_HEAD))
{
send_to_char("Huh?\n\r",ch);
return;
}
if (get_disc(ch,DISC_THANATOSIS) < 3)
{
send_to_char("You require level 3 Thanatosis to change into a pile of Ashes.\n\r",ch);
return;
}
if (!IS_MORE(ch, MORE_ASHES) && IS_AFFECTED(ch,AFF_POLYMORPH))
{
send_to_char("Not from this form.\n\r",ch);
return;
}
if ( ( obj = ch->pcdata->chobj ) != NULL && IS_EXTRA(ch, EXTRA_OSWITCH))
{
ch->pcdata->obj_vnum = 0;
obj->chobj = NULL;
ch->pcdata->chobj = NULL;
REMOVE_BIT(ch->affected_by, AFF_POLYMORPH);
REMOVE_BIT(ch->extra, EXTRA_OSWITCH);
REMOVE_BIT(ch->more, MORE_ASHES);
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);
if (ch->in_room->vnum == ROOM_VNUM_IN_OBJECT)
{
char_from_room(ch);
char_to_room(ch,get_room_index(ROOM_VNUM_HELL));
}
return;
}
if (IS_AFFECTED(ch,AFF_POLYMORPH))
{
send_to_char( "You cannot do this while polymorphed.\n\r", ch);
return;
}
if ((obj = create_object(get_obj_index(OBJ_VNUM_ASHES),0)) == NULL)
{
send_to_char( "Bug - please inform KaVir.\n\r", ch );
return;
}
if (ch->mounted == IS_RIDING) do_dismount(ch,"");
obj_to_room(obj,ch->in_room);
SET_BIT(obj->quest, QUEST_VANISH);
act("$n transforms into $p and falls to the ground.",ch,obj,NULL,TO_ROOM);
act("You transform into $p and fall to the ground.",ch,obj,NULL,TO_CHAR);
if (IS_EXTRA(ch, TIED_UP))
{
act("The ropes binding you fall through your form.",ch,NULL,NULL,TO_CHAR);
act("The ropes binding $n fall through $s form.",ch,NULL,NULL,TO_ROOM);
REMOVE_BIT(ch->extra, TIED_UP);
REMOVE_BIT(ch->extra, GAGGED);
REMOVE_BIT(ch->extra, BLINDFOLDED);
}
if (is_affected(ch, gsn_web))
{
act("The webbing entrapping $n falls through $s form.",ch,NULL,NULL,TO_ROOM);
send_to_char("The webbing entrapping you falls through your form.\n\r",ch);
affect_strip(ch, gsn_web);
}
if (IS_AFFECTED(ch, AFF_WEBBED))
{
act("The webbing entrapping $n falls through $s form.",ch,NULL,NULL,TO_ROOM);
send_to_char("The webbing entrapping you falls through your form.\n\r",ch);
REMOVE_BIT(ch->affected_by, AFF_WEBBED);
}
if (is_affected(ch, gsn_tendrils))
{
act("The tendrils of darkness entrapping $n fall through $s form.",ch,NULL,NULL,TO_ROOM);
send_to_char("The tendrils of darkness entrapping you fall through your form.\n\r",ch);
affect_strip(ch, gsn_tendrils);
}
if (IS_AFFECTED(ch, AFF_SHADOW))
{
act("The tendrils of darkness entrapping $n fall through $s form.",ch,NULL,NULL,TO_ROOM);
send_to_char("The tendrils of darkness entrapping you fall through your form.\n\r",ch);
REMOVE_BIT(ch->affected_by, AFF_SHADOW);
}
if (is_affected(ch, gsn_jail))
{
act("The band of water entrapping $n splash to the ground.",ch,NULL,NULL,TO_ROOM);
send_to_char("The bands of water entrapping you splash to the ground.\n\r",ch);
affect_strip(ch, gsn_jail);
}
if (IS_AFFECTED(ch, AFF_JAIL))
{
act("The band of water entrapping $n splash to the ground.",ch,NULL,NULL,TO_ROOM);
send_to_char("The bands of water entrapping you splash to the ground.\n\r",ch);
REMOVE_BIT(ch->affected_by, AFF_JAIL);
}
ch->pcdata->obj_vnum = OBJ_VNUM_ASHES;
obj->chobj = ch;
ch->pcdata->chobj = obj;
SET_BIT(ch->affected_by, AFF_POLYMORPH);
SET_BIT(ch->extra, EXTRA_OSWITCH);
SET_BIT(ch->more, MORE_ASHES);
free_string(ch->morph);
ch->morph = str_dup(obj->short_descr);
return;
}
void do_withering( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
OBJ_DATA *obj;
char arg [MAX_INPUT_LENGTH];
int critical = number_range(1,4);
argument = one_argument( argument, arg );
if (IS_NPC(ch)) return;
if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch))
{
send_to_char( "Huh?\n\r", ch );
return;
}
if (get_disc(ch,DISC_THANATOSIS) < 4)
{
send_to_char("You require level 4 Thanatosis to use Withering.\n\r",ch);
return;
}
if (IS_ITEMAFF(ch, ITEMA_PEACE)) do_majesty(ch,"");
if ( arg[0] == '\0' )
{
send_to_char( "Who do you wish to use Withering on?\n\r", ch );
return;
}
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "They are not here.\n\r", ch );
return;
}
if (ch == victim)
{
send_to_char( "Now that would be really silly...\n\r", ch );
return;
}
act( "A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM );
WAIT_STATE( ch, 12 );
if ( is_safe(ch, victim) )
{
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to use Withering on you.",ch,NULL,victim,TO_VICT);
}
return;
}
if (number_percent() > (14 - ch->vampgen)*get_disc(ch,DISC_THANATOSIS))
{
send_to_char("Nothing happens.\n\r",ch);
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to use Withering on you.",ch,NULL,victim,TO_VICT);
}
return;
}
if (critical == 1)
{
if (IS_ARM_L(victim,LOST_ARM))
{
send_to_char( "Nothing happens.\n\r", ch );
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to use Withering on you.",ch,NULL,victim,TO_VICT);
}
return;
}
SET_BIT(victim->loc_hp[2],LOST_ARM);
if (IS_BLEEDING(victim,BLEEDING_HAND_L))
REMOVE_BIT(victim->loc_hp[6],BLEEDING_HAND_L);
send_to_char("Your left arm withers up and falls off!\n\r",victim);
act("$n's left arm withers up and falls off!",victim,NULL,NULL,TO_ROOM);
make_part(victim,"arm");
if (IS_ARM_L(victim,LOST_ARM) && IS_ARM_R(victim,LOST_ARM))
{
if ((obj = get_eq_char( victim, WEAR_ARMS )) != NULL)
take_item(victim,obj);
}
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);
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just used Withering on you.",ch,NULL,victim,TO_VICT);
}
if (IS_NPC(victim)) do_kill(victim,ch->name);
return;
}
else if (critical == 2)
{
if (IS_ARM_R(victim,LOST_ARM))
{
send_to_char( "Nothing happens.\n\r", ch );
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to use Withering on you.",ch,NULL,victim,TO_VICT);
}
return;
}
SET_BIT(victim->loc_hp[3],LOST_ARM);
if (IS_BLEEDING(victim,BLEEDING_HAND_R))
REMOVE_BIT(victim->loc_hp[6],BLEEDING_HAND_R);
send_to_char("Your right arm withers up and falls off!\n\r",victim);
act("$n's right arm withers up and falls off!",victim,NULL,NULL,TO_ROOM);
make_part(victim,"arm");
if (IS_ARM_L(victim,LOST_ARM) && IS_ARM_R(victim,LOST_ARM))
{
if ((obj = get_eq_char( victim, WEAR_ARMS )) != NULL)
take_item(victim,obj);
}
if ((obj = get_eq_char( victim, WEAR_WIELD )) != 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);
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just used Withering on you.",ch,NULL,victim,TO_VICT);
}
if (IS_NPC(victim)) do_kill(victim,ch->name);
return;
}
else if (critical == 3)
{
if (IS_LEG_L(victim,LOST_LEG))
{
send_to_char( "Nothing happens.\n\r", ch );
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to use Withering on you.",ch,NULL,victim,TO_VICT);
}
return;
}
SET_BIT(victim->loc_hp[4],LOST_LEG);
if (IS_BLEEDING(victim,BLEEDING_FOOT_L))
REMOVE_BIT(victim->loc_hp[6],BLEEDING_FOOT_L);
send_to_char("Your left leg withers up and falls off!\n\r",victim);
act("$n's left leg withers up and falls off!",victim,NULL,NULL,TO_ROOM);
make_part(victim,"leg");
if (IS_LEG_L(victim,LOST_LEG) && IS_LEG_R(victim,LOST_LEG))
{
if ((obj = get_eq_char( victim, WEAR_LEGS )) != NULL)
take_item(victim,obj);
}
if ((obj = get_eq_char( victim, WEAR_FEET )) != NULL)
take_item(victim,obj);
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just used Withering on you.",ch,NULL,victim,TO_VICT);
}
if (IS_NPC(victim)) do_kill(victim,ch->name);
return;
}
else if (critical == 4)
{
if (IS_LEG_R(victim,LOST_LEG))
{
send_to_char( "Nothing happens.\n\r", ch );
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to use Withering on you.",ch,NULL,victim,TO_VICT);
}
return;
}
SET_BIT(victim->loc_hp[5],LOST_LEG);
if (IS_BLEEDING(victim,BLEEDING_FOOT_R))
REMOVE_BIT(victim->loc_hp[6],BLEEDING_FOOT_R);
send_to_char("Your right leg withers up and falls off!\n\r",victim);
act("$n's right leg withers up and falls off!",victim,NULL,NULL,TO_ROOM);
make_part(victim,"leg");
if (IS_LEG_L(victim,LOST_LEG) && IS_LEG_R(victim,LOST_LEG))
{
if ((obj = get_eq_char( victim, WEAR_LEGS )) != NULL)
take_item(victim,obj);
}
if ((obj = get_eq_char( victim, WEAR_FEET )) != NULL)
take_item(victim,obj);
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just used Withering on you.",ch,NULL,victim,TO_VICT);
}
if (IS_NPC(victim)) do_kill(victim,ch->name);
return;
}
send_to_char("Nothing happens.\n\r",ch);
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to use Withering on you.",ch,NULL,victim,TO_VICT);
}
return;
}
void do_drainlife( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
char arg [MAX_INPUT_LENGTH];
int damage;
if (IS_NPC(ch)) return;
argument = one_argument( argument, arg );
if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch))
{
send_to_char( "Huh?\n\r", ch );
return;
}
if (get_disc(ch,DISC_THANATOSIS) < 5)
{
send_to_char("You require level 5 Thanatosis to use Drain Life from someone.\n\r",ch);
return;
}
if (IS_ITEMAFF(ch, ITEMA_PEACE)) do_majesty(ch,"");
if (arg[0] == '\0' && ch->fighting == NULL)
{
send_to_char( "Who's lifeforce do you wish to Drain?\n\r", ch );
return;
}
if ( ( victim = ch->fighting ) == NULL )
{
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
}
if (is_safe(ch,victim))
{
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to use Drain Life on you.",ch,NULL,victim,TO_VICT);
}
return;
}
if (ch->hit >= ch->max_hit)
{
send_to_char( "But you are already at full lifeforce!\n\r", ch );
return;
}
act( "A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM );
send_to_char("You drain some of their lifeforce.\n\r",ch);
send_to_char("You feel your lifeforce being drained away!\n\r",victim);
damage = number_range(1,10) * (get_disc(ch,DISC_THANATOSIS) * 5);
if (victim->hit <= damage) damage = victim->hit - 1;
if (ch->hit + damage > ch->max_hit) damage -= (ch->max_hit - ch->hit);
ch->hit += damage;
victim->hit -= damage;
if (victim->hit < 1)
{
act("$n's body falls limply to the ground.",victim,NULL,NULL,TO_ROOM);
if (!IS_NPC(victim)) update_pos(victim);
else
{
demon_gain(ch,victim);
group_gain(ch,victim);
victim->form = 10;
killperson(ch,victim);
}
return;
}
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just used Drain Life on you.",ch,NULL,victim,TO_VICT);
}
if (IS_NPC(victim)) do_kill(victim,ch->name);
WAIT_STATE( ch, 12 );
return;
}
void do_putrefaction( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
AFFECT_DATA af;
char arg [MAX_INPUT_LENGTH];
int sn, level;
one_argument( argument, arg );
if (IS_NPC(ch)) return;
if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch))
{
send_to_char( "Huh?\n\r", ch );
return;
}
if (get_disc(ch,DISC_THANATOSIS) < 2)
{
send_to_char("You require level 2 Thanatosis to use Putrefaction.\n\r",ch);
return;
}
if (IS_ITEMAFF(ch, ITEMA_PEACE)) do_majesty(ch,"");
if (arg[0] == '\0')
{
send_to_char( "Who do you wish to use Putrefaction on?\n\r", ch );
return;
}
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if (IS_AFFECTED(victim, AFF_ROT))
{
send_to_char("Their flesh is already rotting.\n\r",ch);
return;
}
if ( IS_NPC(victim) && IS_AFFECTED(victim, AFF_ETHEREAL) )
{
send_to_char("They have no flesh to rot.\n\r",ch);
return;
}
if (is_safe(ch, victim))
{
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to use Putrefaction on you.",ch,NULL,victim,TO_VICT);
}
return;
}
if ( ( sn = skill_lookup( "rotting flesh" ) ) < 0 )
{
send_to_char( "Bug - please inform KaVir.\n\r", ch );
return;
}
act( "A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM );
send_to_char("Your flesh begins to rot!\n\r",victim);
act("$n's flesh begins to rot!",victim,NULL,NULL,TO_ROOM);
level = get_disc(ch,DISC_THANATOSIS);
af.type = sn;
af.location = APPLY_CON;
af.modifier = 0 - level;
af.duration = number_range(level,(2*level));
af.bitvector = AFF_ROT;
affect_join( victim, &af );
WAIT_STATE( ch, 12 );
return;
}
void do_scream( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
char buf[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
CHAR_DATA *victim_next;
int damage;
bool no_dam = FALSE;
one_argument( argument, arg );
if (IS_NPC(ch)) no_dam = TRUE;
else
{
if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch)) no_dam = TRUE;
else if (get_disc(ch,DISC_MELPOMINEE) < 1) no_dam = TRUE;
if (IS_WEREWOLF(ch) && get_tribe(ch, TRIBE_GET_OF_FENRIS) > 2)
no_dam = FALSE;
}
if (!IS_NPC(ch) && ch->pcdata->reina > 0)
{
if (ch->pcdata->reina > 1)
sprintf(buf,"Your voice will not recover for another %d seconds.\n\r",ch->pcdata->reina);
else
sprintf(buf,"Your voice will not recover for another 1 second.\n\r");
send_to_char(buf,ch);
return;
}
if ( arg[0] == '\0' )
{
send_to_char( "You scream loudly!\n\r", ch );
act("$n screams loudly!",ch,NULL,NULL,TO_ROOM);
if (no_dam) return;
if (IS_ITEMAFF(ch, ITEMA_PEACE)) do_majesty(ch,"");
ch->pcdata->reina = 10;
damage = get_disc(ch,DISC_MELPOMINEE) * 10;
for ( victim = ch->in_room->people; victim; victim = victim_next )
{
victim_next = victim->next_in_room;
if ( victim == ch ) continue;
if (IS_IMMORTAL(victim)) continue;
if (!IS_NPC(victim) && (IS_VAMPIRE(victim) || IS_GHOUL(victim)) &&
get_disc(victim,DISC_MELPOMINEE) > 0) continue;
if (is_safe(ch,victim))
{
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just used Scream on you.",ch,NULL,victim,TO_VICT);
}
return;
}
send_to_char("You clutch your head in agony as your eardrums seem to explode!\n\r",victim);
act("$n clutches $s head in agony!",victim,NULL,NULL,TO_ROOM);
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just used Scream on you.",ch,NULL,victim,TO_VICT);
}
victim->hit -= damage;
if ((IS_NPC(victim) && victim->hit < 1) ||
(!IS_NPC(victim) && victim->hit < -10))
{
act("$n's body falls limply to the ground.",victim,NULL,NULL,TO_ROOM);
demon_gain(ch,victim);
group_gain(ch,victim);
victim->form = 11;
killperson(ch,victim);
}
else
{
update_pos(victim);
if (number_range(1,20) <= get_disc(ch,DISC_MELPOMINEE))
{
victim->position = POS_STUNNED;
send_to_char("You fall to the ground, stunned!\n\r",victim);
act("$n falls to the ground, stunned!",victim,NULL,NULL,TO_ROOM);
}
else if (IS_NPC(victim)) do_kill(victim,ch->name);
}
}
WAIT_STATE( ch, 12 );
return;
}
else if ( ( victim = get_char_room( ch, arg ) ) != NULL )
{
if ( victim == ch )
{
send_to_char( "You scream loudly at yourself!\n\r", ch );
act("$n screams loudly at $mself!",ch,NULL,NULL,TO_ROOM);
return;
}
else
{
act("You scream loudly at $N!",ch,NULL,victim,TO_CHAR);
act("$n screams loudly at you!",ch,NULL,victim,TO_VICT);
act("$n screams loudly at $N!",ch,NULL,victim,TO_NOTVICT);
}
if (no_dam) return;
if (IS_ITEMAFF(ch, ITEMA_PEACE)) do_majesty(ch,"");
if (IS_IMMORTAL(victim)) return;
if (!IS_NPC(victim) && (IS_VAMPIRE(victim) || IS_GHOUL(victim)) &&
get_disc(victim,DISC_MELPOMINEE) > 0) return;
if (is_safe(ch,victim))
{
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just used Scream on you.",ch,NULL,victim,TO_VICT);
}
return;
}
damage = get_disc(ch,DISC_MELPOMINEE) * number_range(10,20);
ch->pcdata->reina = 10;
send_to_char("You clutch your head in agony as your eardrums seem to explode!\n\r",victim);
act("$n clutches $s head in agony!",victim,NULL,NULL,TO_ROOM);
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just used Scream on you.",ch,NULL,victim,TO_VICT);
}
victim->hit -= damage;
if ((IS_NPC(victim) && victim->hit < 1) ||
(!IS_NPC(victim) && victim->hit < -10))
{
act("$n's body falls limply to the ground.",victim,NULL,NULL,TO_ROOM);
demon_gain(ch,victim);
group_gain(ch,victim);
victim->form = 11;
killperson(ch,victim);
WAIT_STATE( ch, 12 );
return;
}
update_pos(victim);
if (number_range(1,20) <= get_disc(ch,DISC_MELPOMINEE))
{
victim->position = POS_STUNNED;
send_to_char("You fall to the ground, stunned!\n\r",victim);
act("$n falls to the ground, stunned!",victim,NULL,NULL,TO_ROOM);
}
else if (IS_NPC(victim)) do_kill(victim,ch->name);
WAIT_STATE( ch, 12 );
return;
}
else
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
return;
}
void do_spiritform( CHAR_DATA *ch, char *argument )
{
if (IS_NPC(ch)) return;
if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch))
{
send_to_char("Huh?\n\r",ch);
return;
}
if (get_disc(ch,DISC_PROTEAN) < 7)
{
send_to_char("You require level 7 Protean to transform into Spirit Form.\n\r",ch);
return;
}
if (IS_AFFECTED(ch, AFF_POLYMORPH))
{
if (!IS_POLYAFF(ch,POLY_SPIRIT))
{
send_to_char( "You cannot change from this form.\n\r", ch );
return;
}
act( "Your body regains its substance.", ch, NULL, NULL, TO_CHAR );
act( "$n's ethereal body regains its substance.", ch, NULL, NULL, TO_ROOM );
REMOVE_BIT(ch->affected_by, AFF_POLYMORPH);
REMOVE_BIT(ch->affected_by, AFF_ETHEREAL);
REMOVE_BIT(ch->polyaff, POLY_SPIRIT);
REMOVE_BIT(ch->extra, EXTRA_VICISSITUDE);
REMOVE_BIT(ch->vampaff, VAM_DISGUISED);
REMOVE_BIT(ch->vampaff, VAM_FLYING);
free_string( ch->morph );
ch->morph = str_dup( "" );
return;
}
act( "You body becomes translucent and insubstancial.", ch, NULL, NULL, TO_CHAR );
act( "$n's body becomes translucent and insubstancial.", ch, NULL, NULL, TO_ROOM );
if (IS_EXTRA(ch, TIED_UP))
{
act("The ropes binding you fall through your ethereal form.",ch,NULL,NULL,TO_CHAR);
act("The ropes binding $n fall through $s ethereal form.",ch,NULL,NULL,TO_ROOM);
REMOVE_BIT(ch->extra, TIED_UP);
REMOVE_BIT(ch->extra, GAGGED);
REMOVE_BIT(ch->extra, BLINDFOLDED);
}
if (is_affected(ch, gsn_web))
{
act("The webbing entrapping $n falls through $s ethereal form.",ch,NULL,NULL,TO_ROOM);
send_to_char("The webbing entrapping you falls through your ethereal form.\n\r",ch);
affect_strip(ch, gsn_web);
}
if (IS_AFFECTED(ch, AFF_WEBBED))
{
act("The webbing entrapping $n falls through $s ethereal form.",ch,NULL,NULL,TO_ROOM);
send_to_char("The webbing entrapping you falls through your ethereal form.\n\r",ch);
REMOVE_BIT(ch->affected_by, AFF_WEBBED);
}
if (is_affected(ch, gsn_tendrils))
{
act("The tendrils of darkness entrapping $n fall through $s ethereal form.",ch,NULL,NULL,TO_ROOM);
send_to_char("The tendrils of darkness entrapping you fall through your ethereal form.\n\r",ch);
affect_strip(ch, gsn_tendrils);
}
if (IS_AFFECTED(ch, AFF_SHADOW))
{
act("The tendrils of darkness entrapping $n fall through $s ethereal form.",ch,NULL,NULL,TO_ROOM);
send_to_char("The tendrils of darkness entrapping you fall through your ethereal form.\n\r",ch);
REMOVE_BIT(ch->affected_by, AFF_SHADOW);
}
if (is_affected(ch, gsn_jail))
{
act("The band of water entrapping $n splash to the ground.",ch,NULL,NULL,TO_ROOM);
send_to_char("The bands of water entrapping you splash to the ground.\n\r",ch);
affect_strip(ch, gsn_jail);
}
if (IS_AFFECTED(ch, AFF_JAIL))
{
act("The band of water entrapping $n splash to the ground.",ch,NULL,NULL,TO_ROOM);
send_to_char("The bands of water entrapping you splash to the ground.\n\r",ch);
REMOVE_BIT(ch->affected_by, AFF_JAIL);
}
SET_BIT(ch->affected_by, AFF_POLYMORPH);
SET_BIT(ch->affected_by, AFF_ETHEREAL);
SET_BIT(ch->polyaff, POLY_SPIRIT);
SET_BIT(ch->extra, EXTRA_VICISSITUDE);
SET_BIT(ch->vampaff, VAM_DISGUISED);
SET_BIT(ch->vampaff, VAM_FLYING);
free_string( ch->morph );
ch->morph = str_dup( ch->name );
return;
}
void do_spiritguardian( CHAR_DATA *ch, char *argument )
{
if (IS_NPC(ch)) return;
if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch) )
{
if (IS_WEREWOLF(ch))
{
if (get_auspice(ch, AUSPICE_THEURGE) < 4)
{
send_to_char("You require the level 4 Theurge power to summon your Guardian Spirit.\n\r",ch);
return;
}
}
else
{
send_to_char("Huh?\n\r",ch);
return;
}
}
else if (get_disc(ch,DISC_NECROMANCY) < 4)
{
send_to_char("You require level 4 Necromancy to summon your Spirit Guardian.\n\r",ch);
return;
}
if (IS_MORE(ch, MORE_GUARDIAN) )
{
send_to_char("You dismiss your Spirit Guardian.\n\r",ch);
guardian_message( ch );
send_to_char("I shall return when you call me, Master.\n\r",ch);
REMOVE_BIT(ch->more, MORE_GUARDIAN);
return;
}
send_to_char("You call your Spirit Guardian.\n\r",ch);
guardian_message( ch );
send_to_char("I have arrived, Master.\n\r",ch);
SET_BIT(ch->more, MORE_GUARDIAN);
return;
}
void do_succulence( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
AFFECT_DATA af;
CHAR_DATA *victim;
int sn;
one_argument( argument, arg );
if (IS_NPC(ch)) return;
if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch))
{
send_to_char( "Huh?\n\r", ch );
return;
}
if (get_disc(ch,DISC_ANIMALISM) < 6)
{
send_to_char("You require level 6 Animalism to use Succulence.\n\r",ch);
return;
}
if ( arg[0] == '\0' )
{
send_to_char( "Who do you wish to use Succulence on?\n\r", ch );
return;
}
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if ( ch == victim )
{
send_to_char( "Not on yourself.\n\r", ch );
return;
}
if (!IS_NPC(victim))
{
send_to_char( "Not on players.\n\r", ch );
return;
}
if (is_affected(victim, gsn_potency))
{
send_to_char("You are unable to make them any more succulent.\n\r",ch);
return;
}
if ( ( sn = skill_lookup( "blood potency" ) ) < 0 )
{
send_to_char( "Bug - please inform KaVir.\n\r", ch );
return;
}
af.type = sn;
af.duration = get_disc(ch,DISC_ANIMALISM) * 10;
af.location = APPLY_BLOOD_POT;
af.modifier = victim->blood[BLOOD_POTENCY];
af.bitvector = 0;
affect_to_char( victim, &af );
af.location = APPLY_BLOOD_MAX;
af.modifier = victim->blood[BLOOD_POOL];
affect_to_char( victim, &af );
victim->blood[BLOOD_CURRENT] *= 2;
act( "A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM );
send_to_char("You increase the quality of their blood.\n\r",ch);
return;
}
void do_loyalty( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
one_argument( argument, arg );
if (IS_NPC(ch)) return;
if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch) )
{
send_to_char("Huh?\n\r",ch);
return;
}
if (get_disc(ch,DISC_DOMINATE) < 4)
{
send_to_char("You require level 4 Dominate to use Loyalty.\n\r",ch);
return;
}
if ( arg[0] == '\0' )
{
send_to_char( "Who do you wish to make loyal?\n\r", ch );
return;
}
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if ( ch == victim )
{
send_to_char( "You make yourself loyal to yourself!\n\r", ch );
return;
}
if ( IS_NPC(victim) )
{
send_to_char( "Not on NPC's\n\r", ch );
return;
}
if (strlen(victim->pcdata->conding) < 2 ||
str_cmp(victim->pcdata->conding,ch->name))
{
send_to_char( "They are not conditioned to you.\n\r", ch );
return;
}
act("You stare deeply into $N's eyes.",ch,NULL,victim,TO_CHAR);
act("$n stares deeply into $N's eyes.",ch,NULL,victim,TO_NOTVICT);
act("$n stares deeply into your eyes.",ch,NULL,victim,TO_VICT);
if (IS_MORE(victim,MORE_LOYAL) )
{
act("You remove $N's loyalty to you.", ch, NULL, victim, TO_CHAR);
act("You no longer feel quite so loyal to $n.", ch, NULL, victim, TO_VICT);
REMOVE_BIT(victim->more, MORE_LOYAL);
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just used Loyalty on you.",ch,NULL,victim,TO_VICT);
}
return;
}
act("You make $N completely loyal to you.", ch, NULL, victim, TO_CHAR);
act("You suddenly feel completely loyal to $n.", ch, NULL, victim, TO_VICT);
SET_BIT(victim->more, MORE_LOYAL);
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just used Loyalty on you.",ch,NULL,victim,TO_VICT);
}
return;
}
void do_love( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
char arg [MAX_INPUT_LENGTH];
char buf [MAX_STRING_LENGTH];
one_argument( argument, arg );
if (IS_NPC(ch)) return;
if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch) )
{
send_to_char("Huh?\n\r",ch);
return;
}
if (get_disc(ch,DISC_MELPOMINEE) < 4)
{
send_to_char("You require level 4 Melpominee to sing the Song of Love.\n\r",ch);
return;
}
if (ch->pcdata->reina > 0)
{
if (ch->pcdata->reina > 1)
sprintf(buf,"Your voice will not recover for another %d seconds.\n\r",ch->pcdata->reina);
else
sprintf(buf,"Your voice will not recover for another 1 second.\n\r");
send_to_char(buf,ch);
return;
}
if ( arg[0] == '\0' )
{
send_to_char( "Who do you wish to use the Song of Love on?\n\r", ch );
return;
}
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if ( ch == victim )
{
send_to_char( "You're already in love with yourself.\n\r", ch );
return;
}
if ( IS_NPC(victim) )
{
send_to_char( "Not on NPC's\n\r", ch );
return;
}
if (is_safe(ch,victim)) return;
send_to_char("You sing the Song of Love.\n\r", ch);
act("$n sings a beautiful, haunting song.", ch, NULL, NULL, TO_ROOM );
ch->pcdata->reina = 60;
if (strlen(victim->pcdata->love) > 2)
{
if (!str_cmp(victim->pcdata->love,ch->name))
{
act("You remove $N's love for you!", ch, NULL, victim, TO_CHAR);
act("You are no longer in love with $n!", ch, NULL, victim, TO_VICT);
free_string(victim->pcdata->love);
victim->pcdata->love = str_dup( "" );
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just used Love on you.",ch,NULL,victim,TO_VICT);
}
}
else
{
send_to_char( "They are already in love with someone else.\n\r", ch );
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to use Love on you.",ch,NULL,victim,TO_VICT);
}
}
return;
}
if (!IS_NPC(victim) && (IS_VAMPIRE(victim) || IS_GHOUL(victim)) &&
get_disc(victim,DISC_PRESENCE) >= get_disc(ch,DISC_PRESENCE) )
{
send_to_char("They resist you.\n\r",ch);
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to use Love on you.",ch,NULL,victim,TO_VICT);
}
return;
}
if (!IS_NPC(victim) && victim->pcdata->resist[WILL_PRESENCE] > 0)
{
send_to_char("They resist you.\n\r",ch);
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to use Love on you.",ch,NULL,victim,TO_VICT);
}
return;
}
if (!IS_NPC(victim) && IS_WILLPOWER(victim, RES_PRESENCE) &&
victim->pcdata->willpower[0] >= 10)
{
victim->pcdata->willpower[0] -= 10;
victim->pcdata->resist[WILL_PRESENCE] = 60;
if (!IS_WILLPOWER(victim, RES_TOGGLE))
REMOVE_BIT(victim->pcdata->resist[0], RES_PRESENCE);
send_to_char("You burn some willpower to resist Love.\n\r",victim);
send_to_char("They resist you.\n\r",ch);
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to use Love on you.",ch,NULL,victim,TO_VICT);
}
return;
}
act("You make $N fall in love with you!", ch, NULL, victim, TO_CHAR);
act("You fall in love with $n!", ch, NULL, victim, TO_VICT);
act("$N gazes lovingly into $n's eyes!", ch, NULL, victim, TO_NOTVICT);
free_string(victim->pcdata->love);
victim->pcdata->love = str_dup( ch->name );
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just used Love on you.",ch,NULL,victim,TO_VICT);
}
return;
}
void do_frenzy( CHAR_DATA *ch, char *argument )
{
if (IS_NPC(ch)) return;
if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch) )
{
send_to_char("Huh?\n\r",ch);
return;
}
if (get_disc(ch,DISC_ANIMALISM) < 7)
{
send_to_char("You require level 7 Animalism to use Frenzy Trigger.\n\r",ch);
return;
}
if ( ch->pcdata->wolf > 0 )
{
send_to_char("You take a deep breath and force back your inner beast.\n\r",ch);
act("$n takes a deep breath and forces back $s inner beast.",ch,NULL,NULL,TO_ROOM);
ch->pcdata->wolf = 0;
if (IS_VAMPAFF(ch, VAM_NIGHTSIGHT) &&
get_disc(ch,DISC_PROTEAN) > 0)
do_nightsight(ch,"");
if (IS_VAMPAFF(ch, VAM_FANGS)) do_fangs(ch,"");
if (IS_VAMPAFF(ch, VAM_CLAWS) &&
get_disc(ch,DISC_PROTEAN) > 1)
do_claws(ch,"");
WAIT_STATE(ch,12);
return;
}
if (!IS_VAMPAFF(ch, VAM_NIGHTSIGHT) &&
get_disc(ch,DISC_PROTEAN) > 0)
do_nightsight(ch,"");
if (!IS_VAMPAFF(ch, VAM_FANGS)) do_fangs(ch,"");
if (!IS_VAMPAFF(ch, VAM_CLAWS) &&
get_disc(ch,DISC_PROTEAN) > 1)
do_claws(ch,"");
send_to_char("You bare yours fangs and growl as your inner beast consumes you.\n\r",ch);
act("$n bares $s fangs and growls as $s inner beast consumes $m.",ch,NULL,NULL,TO_ROOM);
ch->pcdata->wolf += number_range(10,20);
WAIT_STATE(ch,12);
return;
}
/* A coterie is a group of vampire players who work together. */
void do_coterie( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
CHAR_DATA *gch;
char arg [MAX_INPUT_LENGTH];
char arg2 [MAX_INPUT_LENGTH];
char arg3 [MAX_INPUT_LENGTH];
char buf [MAX_STRING_LENGTH];
char *strtime;
int discipline, disc, level, value;
/* Remove the first 'word' from the entered string, and copy it into
* arg.
*/
argument = one_argument( argument, arg );
/* Removes the tildes from argument for file-saving purposes. */
smash_tilde( argument );
/* This command cannot be used by Non-Player Characters (mobiles). */
if (IS_NPC(ch)) return;
/* Only vampires should be able to form coteries. */
if (!IS_VAMPIRE(ch))
{
send_to_char( "Huh?\n\r", ch );
return;
}
/* If no parameters or the 'info' parameter are added, then the player
* should see a list of all the members of their coterie if they have
* one, or a list of coterie options if they don't.
*/
if ( arg[0] == '\0' || !str_cmp(arg, "info") )
{
/* If they person belongs to a coterie, then this should list all
* the coterie members.
*/
if (strlen(ch->pcdata->coterie) > 1 && strlen(ch->pcdata->leader) > 1 &&
strlen(ch->pcdata->cot_time) > 1)
{
/* Show the name of the coterie, and who founded it. */
sprintf( buf, "The %s coterie, lead by %s:\n\r",
ch->pcdata->coterie, ch->pcdata->leader );
send_to_char( buf, ch );
send_to_char("--------------------------------------------------------------------------------\n\r",ch);
/* Display the following information about the coterie members:
* Name: The name of the member.
* Rank: Their position within the coterie - Leader, champion, etc.
* Clan: What vampire clan they belong to.
* Gen: What generation of vampire they are.
* Hits: What condition of physical damage the vampire is in.
* Exp: How many experience points the vampire has.
* Status:How many players the vampire has killed.
*/
send_to_char("[ Name ] [ Rank ] [ Clan ] [ Gen ] [ Hits ] [ Exp ] [ Status ]\n\r", ch );
/* Check each player in the char_list for a match. */
for ( gch = char_list; gch != NULL; gch = gch->next )
{
if ( IS_NPC(gch) ) continue;
if ( !IS_VAMPIRE(gch) ) continue;
if ( strlen(gch->pcdata->coterie) < 2) continue;
if ( strlen(gch->pcdata->cot_time) < 2) continue;
if ( strlen(gch->pcdata->leader) < 2) continue;
if ( str_cmp(ch->pcdata->leader,gch->pcdata->leader) ) continue;
if ( str_cmp(ch->pcdata->cot_time,gch->pcdata->cot_time) ) continue;
if ( !str_cmp(ch->pcdata->coterie,gch->pcdata->coterie) )
{
/* Players with no clan are called Caitiff. The Serpents
* of the Light and Daughters of Cacophony have too long
* names to display on the screen, so I abbreviate them.
*/
if (strlen(gch->clan) < 2)
strcpy(arg,"Caitiff");
else if (!str_cmp(gch->clan,"Serpents of the Light"))
strcpy(arg,"Serpents");
else if (!str_cmp(gch->clan,"Daughters of Cacophony"))
strcpy(arg,"Daughters");
else
strcpy(arg,gch->clan);
sprintf( buf,
"[%-16s] [%8s] [%-12s] [ %-2d ] [%-6d] [%-5d] [ %-3d ]\n\r",
capitalize( gch->name ),
IS_MORE(gch, MORE_LEADER) ? " Leader " :
IS_MORE(gch, MORE_CHAMPION) ? "Champion" : " Member ",
arg,
gch->vampgen, gch->hit, gch->exp, gch->race );
send_to_char( buf, ch );
}
}
send_to_char("--------------------------------------------------------------------------------\n\r",ch);
send_to_char( "For more information type 'coterie help'.\n\r", ch );
send_to_char("--------------------------------------------------------------------------------\n\r",ch);
return;
}
/* If the player doesn't belong to a coterie, then display the
* information about how they can create one.
*/
send_to_char("--------------------------------------------------------------------------------\n\r",ch);
send_to_char(" -= Coterie Options =-\n\r",ch);
send_to_char("--------------------------------------------------------------------------------\n\r",ch);
send_to_char("CHAMPION : Make a member into a champion.\n\r",ch);
send_to_char("FOUND : Founds a new Coterie.\n\r",ch);
send_to_char("INDUCT : Inducts a member into your coterie.\n\r",ch);
send_to_char("INFO : Lists information on your coterie.\n\r",ch);
send_to_char("LEAVE : Leaves your current Coterie.\n\r",ch);
send_to_char("OUTCAST : Outcasts a member from your coterie.\n\r",ch);
send_to_char("READY : Coterie rules are completed.\n\r",ch);
send_to_char("RULES : Lists the coterie rules.\n\r",ch);
send_to_char("--------------------------------------------------------------------------------\n\r",ch);
return;
}
/* This allows a member to leave the coterie they currently belong to. */
if ( !str_cmp(arg, "leave") )
{
/* Check if the person is actually a coterie member. */
if (strlen(ch->pcdata->coterie) < 2 ||
strlen(ch->pcdata->cot_time) < 2 ||
strlen(ch->pcdata->leader) < 2)
{
send_to_char( "But you are not a member of any coterie!\n\r", ch );
return;
}
/* Check each player in the char_list for a match. */
for ( gch = char_list; gch != NULL; gch = gch->next )
{
if ( IS_NPC(gch) ) continue;
if ( !IS_VAMPIRE(gch) ) continue;
if ( strlen(gch->pcdata->coterie) < 2) continue;
if ( strlen(gch->pcdata->leader) < 2) continue;
if ( strlen(gch->pcdata->cot_time) < 2) continue;
if ( ch == gch ) continue;
if ( str_cmp(ch->pcdata->leader,gch->pcdata->leader) ) continue;
if ( str_cmp(ch->pcdata->cot_time,gch->pcdata->cot_time) ) continue;
if ( !str_cmp(ch->pcdata->coterie,gch->pcdata->coterie) )
{
/* If the leader leaves their own coterie, then it will
* be disbanded, and all other online members kicked out.
*/
if (IS_MORE(ch, MORE_LEADER))
{
act( "Info -> $n has disbanded the coterie.", ch, NULL, gch, TO_VICT );
free_string(gch->pcdata->coterie);
gch->pcdata->coterie = str_dup( "" );
free_string(gch->pcdata->leader);
gch->pcdata->leader = str_dup( "" );
}
else
act( "Info -> $n has left the coterie.", ch, NULL, gch, TO_VICT );
}
}
if (IS_MORE(ch, MORE_LEADER))
send_to_char("You disband the coterie.\n\r",ch);
else
send_to_char("You leave the coterie.\n\r",ch);
REMOVE_BIT(ch->more, MORE_CHAMPION);
free_string(ch->pcdata->coterie);
ch->pcdata->coterie = str_dup( "" );
free_string(ch->pcdata->leader);
ch->pcdata->leader = str_dup( "" );
REMOVE_BIT(ch->more, MORE_LEADER);
return;
}
/* This allows someone to found a new coterie. */
if ( !str_cmp(arg, "found") )
{
/* You cannot already belong to a coterie. */
if (strlen(ch->pcdata->coterie) > 1)
{
send_to_char( "But you are already the member of a coterie!\n\r", ch );
return;
}
if (argument[0] == '\0')
{
send_to_char( "What do you wish to call your coterie?\n\r", ch );
return;
}
if (strlen(argument) < 5 || strlen(argument) > 20 )
{
send_to_char( "Your coterie name should be between 5 and 20 characters long.\n\r", ch );
return;
}
/* Calculate and store the time the coterie was created. Two
* coteries of the same name created by the same person at different
* times are considered different coteries to prevent a single coterie
* having different rules for different members.
*/
strtime = ctime( ¤t_time );
strtime[strlen(strtime)-1] = '\0';
free_string(ch->pcdata->cot_time);
ch->pcdata->cot_time = str_dup( strtime );
send_to_char("You have founded a new coterie!\n\r",ch);
free_string(ch->pcdata->coterie);
ch->pcdata->coterie = str_dup( argument );
free_string(ch->pcdata->leader);
ch->pcdata->leader = str_dup( ch->name );
SET_BIT(ch->more, MORE_LEADER);
REMOVE_BIT(ch->more, MORE_CHAMPION);
free_string(ch->pcdata->cot_sides);
if (strlen(ch->side) < 2)
ch->pcdata->cot_sides = str_dup( "None" );
else
ch->pcdata->cot_sides = str_dup( ch->side );
free_string(ch->pcdata->cot_clans);
if (strlen(ch->clan) < 2)
ch->pcdata->cot_clans = str_dup( "Caitiff" );
else
ch->pcdata->cot_clans = str_dup( ch->clan );
/* Wipe any discipline limitations/requirements from any previous
* coteries the player might have belonged to.
*/
for (value = COT_BANNED; value <= COT_MAX; value++)
{ch->pcdata->cot_min[value] = 0;}
ch->pcdata->cot_min[COT_GENERATION] = 13;
return;
}
if ( !str_cmp(arg, "induct") )
{
/* You cannot induct someone unless you actually belong to a
* coterie.
*/
if (strlen(ch->pcdata->coterie) < 2 ||
strlen(ch->pcdata->cot_time) < 2 ||
strlen(ch->pcdata->cot_clans) < 2 ||
strlen(ch->pcdata->cot_sides) < 2 ||
strlen(ch->pcdata->leader) < 2)
{
send_to_char( "But you are not a member of any coterie!\n\r", ch );
return;
}
if (!IS_MORE(ch, MORE_LEADER) && !IS_MORE(ch, MORE_CHAMPION))
{
send_to_char( "Only a coterie leader or champion can induct new members.\n\r", ch );
return;
}
if (!IS_MORE(ch, MORE_CHAMPION) && IS_MORE(ch, MORE_LEADER))
{
send_to_char( "Your coterie has not yet been completely set up.\n\r", ch );
return;
}
if (argument[0] == '\0')
{
send_to_char( "Who do you wish to induct?\n\r", ch );
return;
}
if ( ( victim = get_char_room( ch, argument ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
/* Only player vampires are allowed in the coterie. */
if (IS_NPC(victim))
{
send_to_char( "Not on NPC's.\n\r", ch );
return;
}
if (!IS_VAMPIRE(victim))
{
send_to_char( "You can only induct vampires.\n\r", ch );
return;
}
/* If not all clans are allowed in the coterie, then we better
* check that the clan of the recruit is permitted.
*/
if (!is_name("All",ch->pcdata->cot_clans))
{
/* Caitiff are not stored as a string value, but rather as a
* lack of one.
* Check appropriate clan is permitted.
*/
if (strlen(victim->clan) < 2 &&
!is_name("Caitiff",ch->pcdata->cot_clans))
{
send_to_char( "You are not allowed Caitiff in your coterie.\n\r", ch );
return;
}
else if (!str_cmp(victim->clan,"Serpents of the Light") &&
!is_name("serpents", ch->pcdata->cot_clans))
{
send_to_char( "You are not allowed that clan in your coterie.\n\r", ch );
return;
}
else if (!str_cmp(victim->clan,"Daughters of Cacophony") &&
!is_name("daughters", ch->pcdata->cot_clans))
{
send_to_char( "You are not allowed that clan in your coterie.\n\r", ch );
return;
}
else if (!is_name(victim->clan,ch->pcdata->cot_clans))
{
send_to_char( "You are not allowed that clan in your coterie.\n\r", ch );
return;
}
}
/* If not all sects are allowed in the coterie, then we better
* check that the sect of the recruit is permitted.
*/
if (!is_name("All",ch->pcdata->cot_sides))
{
if (strlen(victim->side) < 2 &&
!is_name("None",ch->pcdata->cot_sides))
{
send_to_char( "You are not allowed Kindred of no sect in your coterie.\n\r", ch );
return;
}
else if (!is_name(victim->side,ch->pcdata->cot_sides))
{
send_to_char( "You are not allowed Kindred of that sect in your coterie.\n\r", ch );
return;
}
}
/* You cannot induct someone who is already in the coterie! */
if ( strlen(victim->pcdata->coterie) > 1 &&
strlen(victim->pcdata->leader) > 1 &&
strlen(victim->pcdata->cot_time) > 1 &&
!str_cmp(ch->pcdata->coterie,victim->pcdata->coterie) &&
!str_cmp(ch->pcdata->cot_time,victim->pcdata->cot_time) &&
!str_cmp(ch->pcdata->leader, victim->pcdata->leader) )
{
send_to_char( "They are already a member of your coterie.\n\r", ch );
return;
}
/* People already in other coteries have to leave before joining
* another one.
*/
if (strlen(victim->pcdata->coterie) > 1)
{
send_to_char( "You cannot induct an unwilling person.\n\r", ch );
return;
}
/* Unwilling people cannot be forced to join. */
if (!IS_IMMUNE(victim,IMM_VAMPIRE))
{
send_to_char( "You cannot induct an unwilling person.\n\r", ch );
return;
}
/* Check they have the required disciplines (powers).
* Go through each required level of power (banned, basic,
* intermediate, advanced, and expert) and for each one, check
* for each discipline.
*/
for (level = COT_BANNED; level <= COT_EXPERT; level++)
{
for (value = DISC_ANIMALISM; value <= DISC_VICISSITUDE; value++)
{
/* The FOR loop requires DISC_ values, which are in the
* range 0 to 19. However the disciplines are stored in the
* players coterie information as bits, so we have to work out
* which discipline number relates to which bit.
*/
switch (value)
{
default: disc = POW_NONE; break;
case DISC_ANIMALISM: disc = POW_ANIMALISM; break;
case DISC_AUSPEX: disc = POW_AUSPEX; break;
case DISC_CELERITY: disc = POW_CELERITY; break;
case DISC_CHIMERSTRY: disc = POW_CHIMERSTRY; break;
case DISC_DAIMOINON: disc = POW_DAIMOINON; break;
case DISC_DOMINATE: disc = POW_DOMINATE; break;
case DISC_FORTITUDE: disc = POW_FORTITUDE; break;
case DISC_MELPOMINEE: disc = POW_MELPOMINEE; break;
case DISC_NECROMANCY: disc = POW_NECROMANCY; break;
case DISC_OBEAH: disc = POW_OBEAH; break;
case DISC_OBFUSCATE: disc = POW_OBFUSCATE; break;
case DISC_OBTENEBRATION: disc = POW_OBTENEBRATION; break;
case DISC_POTENCE: disc = POW_POTENCE; break;
case DISC_PRESENCE: disc = POW_PRESENCE; break;
case DISC_PROTEAN: disc = POW_PROTEAN; break;
case DISC_QUIETUS: disc = POW_QUIETUS; break;
case DISC_SERPENTIS: disc = POW_SERPENTIS; break;
case DISC_THANATOSIS: disc = POW_THANATOSIS; break;
case DISC_THAUMATURGY: disc = POW_THAUMATURGY; break;
case DISC_VICISSITUDE: disc = POW_VICISSITUDE; break;
}
/* Now we check if they have the required discipline at
* the specified level, and display a message accordingly.
*/
switch (level)
{
default: break;
case COT_BANNED:
if (IS_SET(ch->pcdata->cot_min[level], disc) &&
victim->pcdata->powers[value] != 0)
{
send_to_char( "They have a banned discipline.\n\r", ch );
return;
}
break;
case COT_BASIC:
if (IS_SET(ch->pcdata->cot_min[level], disc) &&
victim->pcdata->powers[value] < 1)
{
send_to_char( "They don't have the required disciplines.\n\r", ch );
return;
}
break;
case COT_INTERMEDIATE:
if (IS_SET(ch->pcdata->cot_min[level], disc) &&
victim->pcdata->powers[value] < 3)
{
send_to_char( "They don't have the required disciplines.\n\r", ch );
return;
}
break;
case COT_ADVANCED:
if (IS_SET(ch->pcdata->cot_min[level], disc) &&
victim->pcdata->powers[value] < 5)
{
send_to_char( "They don't have the required disciplines.\n\r", ch );
return;
}
break;
case COT_EXPERT:
if (IS_SET(ch->pcdata->cot_min[level], disc) &&
victim->pcdata->powers[value] < 6)
{
send_to_char( "They don't have the required disciplines.\n\r", ch );
return;
}
break;
}
}
}
/* Some coteries have a minimum hit point entry requirement. */
if (victim->max_hit < ch->pcdata->cot_min[COT_HP])
{
send_to_char( "They have insufficient hit points to join your coterie.\n\r", ch );
return;
}
/* Some coteries have a maximum generation entry requirement. */
if (victim->vampgen > ch->pcdata->cot_min[COT_GENERATION])
{
send_to_char( "They are not low enough generation to join your coterie.\n\r", ch );
return;
}
/* Some coteries have a minimum weapon skill entry requirement. */
if (highest_skill(victim) < ch->pcdata->cot_min[COT_SKILL])
{
send_to_char( "They are not good enough with weapons to join your coterie.\n\r", ch );
return;
}
/* Some coteries have a minimum fighting stance entry requirement. */
if (IS_SET(ch->pcdata->cot_min[COT_EXTRA], COT_ADV_STANCE) &&
highest_stance(victim, TRUE) < ch->pcdata->cot_min[COT_STANCE])
{
send_to_char( "They are not good enough with advanced stances to join your coterie.\n\r", ch );
return;
}
/* Some coteries require an advanced stance entry requirement. */
if (!IS_SET(ch->pcdata->cot_min[COT_EXTRA], COT_ADV_STANCE) &&
highest_stance(victim, FALSE) < ch->pcdata->cot_min[COT_STANCE])
{
send_to_char( "They are not good enough with stances to join your coterie.\n\r", ch );
return;
}
/* Some coteries require Golconda before you may enter.
* Golconda is a form of inner peace which most vampires strive for.
*/
if (IS_SET(ch->pcdata->cot_min[COT_EXTRA], COT_GOLCONDA) &&
victim->beast > 0)
{
send_to_char( "But they don't have Golconda!\n\r", ch );
return;
}
/* Some coteries don't allow diablerists.
* A diablerist is a vampire who drinks the blood of another vampire.
*/
if (IS_SET(ch->pcdata->cot_min[COT_EXTRA], COT_NO_DIABLERIE) &&
victim->pcdata->diableries[DIAB_TIME] > 0)
{
send_to_char( "But they're a diablerist!\n\r", ch );
return;
}
act("You induct $N into your coterie.",ch,NULL,victim,TO_CHAR);
act("$n inducts you into $s coterie.",ch,NULL,victim,TO_VICT);
/* Check each player in the char_list for a match. */
for ( gch = char_list; gch != NULL; gch = gch->next )
{
if ( IS_NPC(gch) ) continue;
if ( !IS_VAMPIRE(gch) ) continue;
if ( strlen(gch->pcdata->coterie) < 2) continue;
if ( strlen(gch->pcdata->cot_time) < 2) continue;
if ( strlen(gch->pcdata->leader) < 2) continue;
if ( str_cmp(ch->pcdata->leader,gch->pcdata->leader) ) continue;
if ( str_cmp(ch->pcdata->cot_time,gch->pcdata->cot_time) ) continue;
if ( !str_cmp(ch->pcdata->coterie,gch->pcdata->coterie) )
act( "Info -> $N has been inducted to the coterie!", gch, NULL, victim, TO_CHAR );
}
/* Clear all their coterie values and replace them with the
* values of a coterie member.
*/
free_string(victim->pcdata->coterie);
victim->pcdata->coterie = str_dup( ch->pcdata->coterie );
free_string(victim->pcdata->cot_time);
victim->pcdata->cot_time = str_dup( ch->pcdata->cot_time );
free_string(victim->pcdata->leader);
victim->pcdata->leader = str_dup( ch->pcdata->leader );
free_string(victim->pcdata->cot_clans);
victim->pcdata->cot_clans = str_dup( ch->pcdata->cot_clans );
free_string(victim->pcdata->cot_sides);
victim->pcdata->cot_sides = str_dup( ch->pcdata->cot_sides );
REMOVE_BIT(victim->more, MORE_CHAMPION);
REMOVE_BIT(victim->more, MORE_LEADER);
/* The new member has the same discipline requirements as the
* person who inducted them.
*/
for (value = COT_BANNED; value <= COT_MAX; value++)
{victim->pcdata->cot_min[value] = ch->pcdata->cot_min[value];}
return;
}
if ( !str_cmp(arg, "outcast") )
{
/* You cannot outcast someone unless you actually belong to their
* coterie, and even then only a select few can do it.
*/
if (strlen(ch->pcdata->coterie) < 2 ||
strlen(ch->pcdata->cot_time) < 2 ||
strlen(ch->pcdata->leader) < 2)
{
send_to_char( "But you are not a member of any coterie!\n\r", ch );
return;
}
if (!IS_MORE(ch, MORE_LEADER) && !IS_MORE(ch, MORE_CHAMPION))
{
send_to_char( "Only a coterie leader or champion can outcast members.\n\r", ch );
return;
}
if (!IS_MORE(ch, MORE_CHAMPION) && IS_MORE(ch, MORE_LEADER))
{
send_to_char( "Your coterie has not yet been completely set up.\n\r", ch );
return;
}
/* Find the person to be outcast, and check that they are valid. */
if (argument[0] == '\0')
{
send_to_char( "Who do you wish to outcast?\n\r", ch );
return;
}
if ( ( victim = get_char_world( ch, argument ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if (IS_NPC(victim))
{
send_to_char( "Not on NPC's.\n\r", ch );
return;
}
if (!IS_VAMPIRE(victim))
{
send_to_char( "You can only induct vampires.\n\r", ch );
return;
}
if (victim == ch)
{
send_to_char( "You cannot outcast yourself.\n\r", ch );
return;
}
if (strlen(victim->pcdata->coterie) < 2 ||
strlen(victim->pcdata->cot_time) < 2 ||
strlen(victim->pcdata->leader) < 2)
{
send_to_char( "They are not a member of your coterie.\n\r", ch );
return;
}
if (str_cmp(ch->pcdata->leader,victim->pcdata->leader))
{
send_to_char( "They are not a member of your coterie.\n\r", ch );
return;
}
if (str_cmp(ch->pcdata->coterie,victim->pcdata->coterie))
{
send_to_char( "They are not a member of your coterie.\n\r", ch );
return;
}
if (str_cmp(ch->pcdata->cot_time,victim->pcdata->cot_time))
{
send_to_char( "They are not a member of your coterie.\n\r", ch );
return;
}
if (IS_MORE(victim, MORE_LEADER) || IS_MORE(victim, MORE_CHAMPION))
{
send_to_char( "You can only outcast regular members.\n\r", ch );
return;
}
act("You outcast $N from the coterie.",ch,NULL,victim,TO_CHAR);
act("$n outcasts you from the coterie.",ch,NULL,victim,TO_VICT);
/* Clear the person's coterie values, as they are no longer a
* coterie member.
*/
free_string(victim->pcdata->coterie);
victim->pcdata->coterie = str_dup( "" );
free_string(victim->pcdata->cot_time);
victim->pcdata->cot_time = str_dup( "None" );
free_string(victim->pcdata->leader);
victim->pcdata->leader = str_dup( "" );
free_string(victim->pcdata->cot_clans);
victim->pcdata->cot_clans = str_dup( "All" );
free_string(victim->pcdata->cot_sides);
victim->pcdata->cot_sides = str_dup( "All" );
REMOVE_BIT(victim->more, MORE_CHAMPION);
for (value = COT_BANNED; value <= COT_MAX; value++)
{victim->pcdata->cot_min[value] = 0;}
/* Inform remaining members that their coterie has lost a member. */
for ( gch = char_list; gch != NULL; gch = gch->next )
{
if ( IS_NPC(gch) ) continue;
if ( !IS_VAMPIRE(gch) ) continue;
if ( strlen(gch->pcdata->coterie) < 2) continue;
if ( strlen(gch->pcdata->cot_time) < 2) continue;
if ( strlen(gch->pcdata->leader) < 2) continue;
if ( str_cmp(ch->pcdata->leader,gch->pcdata->leader) ) continue;
if ( str_cmp(ch->pcdata->cot_time,gch->pcdata->cot_time) ) continue;
if ( !str_cmp(ch->pcdata->coterie,gch->pcdata->coterie) )
act( "Info -> $N has been kicked out of the coterie!", gch, NULL, victim, TO_CHAR );
}
return;
}
/* This allows a coterie leader to make someone into a champion - a
* person who has the ability to recruit new members. A sort of
* sub-leader.
*/
if ( !str_cmp(arg, "champion") )
{
if (strlen(ch->pcdata->coterie) < 2 ||
strlen(ch->pcdata->cot_time) < 2 ||
strlen(ch->pcdata->cot_clans) < 2 ||
strlen(ch->pcdata->cot_sides) < 2 ||
strlen(ch->pcdata->leader) < 2)
{
send_to_char( "But you are not a member of any coterie!\n\r", ch );
return;
}
if (!IS_MORE(ch, MORE_LEADER))
{
send_to_char( "Only a coterie leader can make someone a champion.\n\r", ch );
return;
}
if (!IS_MORE(ch, MORE_CHAMPION))
{
send_to_char( "Your coterie has not yet been completely set up.\n\r", ch );
return;
}
/* Find the person to be made a champion, and check they are valid. */
if (argument[0] == '\0')
{
send_to_char( "Who do you wish to make into a champion?\n\r", ch );
return;
}
if ( ( victim = get_char_world( ch, argument ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if (IS_NPC(victim))
{
send_to_char( "Not on NPC's.\n\r", ch );
return;
}
if (!IS_VAMPIRE(victim))
{
send_to_char( "Only on vampires.\n\r", ch );
return;
}
if (victim == ch)
{
send_to_char( "You cannot make yourself a champion!\n\r", ch );
return;
}
/* You can only make members of your own coterie into a champion. */
if (strlen(victim->pcdata->coterie) < 2 ||
strlen(victim->pcdata->cot_time) < 2 ||
strlen(victim->pcdata->leader) < 2)
{
send_to_char( "They are not a member of your coterie.\n\r", ch );
return;
}
if (str_cmp(ch->pcdata->leader,victim->pcdata->leader))
{
send_to_char( "They are not a member of your coterie.\n\r", ch );
return;
}
if (str_cmp(ch->pcdata->coterie,victim->pcdata->coterie))
{
send_to_char( "They are not a member of your coterie.\n\r", ch );
return;
}
if (str_cmp(ch->pcdata->cot_time,victim->pcdata->cot_time))
{
send_to_char( "They are not a member of your coterie.\n\r", ch );
return;
}
/* Inform all members of the coterie that the person has been
* made/unmade a champion.
*/
if (!IS_MORE(victim, MORE_CHAMPION))
{
act("You make $N a coterie champion.",ch,NULL,victim,TO_CHAR);
act("$n makes you a coterie champion.",ch,NULL,victim,TO_VICT);
sprintf(buf,"Info -> $N has been made a champion!");
SET_BIT(victim->more, MORE_CHAMPION);
}
else
{
act("You remove $N's coterie champion position.",ch,NULL,victim,TO_CHAR);
act("$n removes your coterie champion position.",ch,NULL,victim,TO_VICT);
sprintf(buf,"Info -> $N is no longer a coterie champion!");
REMOVE_BIT(victim->more, MORE_CHAMPION);
}
for ( gch = char_list; gch != NULL; gch = gch->next )
{
if ( IS_NPC(gch) ) continue;
if ( !IS_VAMPIRE(gch) ) continue;
if ( strlen(gch->pcdata->coterie) < 2) continue;
if ( strlen(gch->pcdata->cot_time) < 2) continue;
if ( strlen(gch->pcdata->leader) < 2) continue;
if ( str_cmp(ch->pcdata->leader,gch->pcdata->leader) ) continue;
if ( str_cmp(ch->pcdata->cot_time,gch->pcdata->cot_time) ) continue;
if ( !str_cmp(ch->pcdata->coterie,gch->pcdata->coterie) )
act( buf, gch, NULL, victim, TO_CHAR );
}
return;
}
/* This is used when the coterie rules are complete and the coterie
* is ready to take on new members.
*/
if ( !str_cmp(arg, "ready") )
{
if (strlen(ch->pcdata->coterie) < 2 ||
strlen(ch->pcdata->cot_time) < 2 ||
strlen(ch->pcdata->leader) < 2)
{
send_to_char( "But you are not a member of any coterie!\n\r", ch );
return;
}
if (!IS_MORE(ch, MORE_LEADER))
{
send_to_char( "Only a coterie leader can say when the coterie is ready.\n\r", ch );
return;
}
if (IS_MORE(ch, MORE_CHAMPION))
{
send_to_char( "But your coterie has already been completed!\n\r", ch );
return;
}
SET_BIT(ch->more, MORE_CHAMPION);
send_to_char( "Your coterie is now ready to accept new members!\n\r", ch );
return;
}
/* This allows the coterie leader to define the rules of the coterie. */
if ( !str_cmp(arg, "rules") )
{
/* Cut off the next two 'words' in the original input string and
* copy their contents into arg2 and arg3.
*/
argument = one_argument( argument, arg2 );
argument = one_argument( argument, arg3 );
if (strlen(ch->pcdata->coterie) < 2 ||
strlen(ch->pcdata->cot_time) < 2 ||
strlen(ch->pcdata->leader) < 2)
{
send_to_char( "But you are not a member of any coterie!\n\r", ch );
return;
}
/* If the coterie has been set as READY, then you cannot change
* the rules - This command will now only display existing rules.
*/
if (IS_MORE(ch, MORE_LEADER) && IS_MORE(ch, MORE_CHAMPION))
{
show_disc(ch);
return;
}
/* If you are not a leader, or no parameters are supplied, then
* just list the current rules.
*/
if (arg2[0] == '\0' || !IS_MORE(ch, MORE_LEADER))
{
show_disc(ch);
return;
}
/* Specify which clans are permitted in the coterie. */
if (!str_cmp(arg2,"clans"))
{
if (arg3[0] == '\0')
{
send_to_char("Please specify which clans are allowed in your coterie (clear to start over).\n\r",ch);
return;
}
if (!str_cmp(arg3,"all"))
{
send_to_char("Ok.\n\r",ch);
free_string(ch->pcdata->cot_clans);
ch->pcdata->cot_clans = str_dup( "All" );
return;
}
/* This method is required as not all inputs are simple
* capitalised.
*/
else if (!str_cmp(arg3,"assamite") ) strcpy(arg3, "Assamite");
else if (!str_cmp(arg3,"assamites")) strcpy(arg3, "Assamite");
else if (!str_cmp(arg3,"baali") ) strcpy(arg3, "Baali");
else if (!str_cmp(arg3,"brujah") ) strcpy(arg3, "Brujah");
else if (!str_cmp(arg3,"caitiff") ) strcpy(arg3, "Caitiff");
else if (!str_cmp(arg3,"daughters")) strcpy(arg3, "Daughters");
else if (!str_cmp(arg3,"gangrel") ) strcpy(arg3, "Gangrel");
else if (!str_cmp(arg3,"giovanni") ) strcpy(arg3, "Giovanni");
else if (!str_cmp(arg3,"lasombra") ) strcpy(arg3, "Lasombra");
else if (!str_cmp(arg3,"malkavian")) strcpy(arg3, "Malkavian");
else if (!str_cmp(arg3,"nosferatu")) strcpy(arg3, "Nosferatu");
else if (!str_cmp(arg3,"panders") ) strcpy(arg3, "Panders");
else if (!str_cmp(arg3,"ravnos") ) strcpy(arg3, "Ravnos");
else if (!str_cmp(arg3,"samedi") ) strcpy(arg3, "Samedi");
else if (!str_cmp(arg3,"serpents") ) strcpy(arg3, "Serpents");
else if (!str_cmp(arg3,"setite") ) strcpy(arg3, "Setite");
else if (!str_cmp(arg3,"setites") ) strcpy(arg3, "Setite");
else if (!str_cmp(arg3,"toreador") ) strcpy(arg3, "Toreador");
else if (!str_cmp(arg3,"tremere") ) strcpy(arg3, "Tremere");
else if (!str_cmp(arg3,"tzimisce") ) strcpy(arg3, "Tzimisce");
else if (!str_cmp(arg3,"ventrue") ) strcpy(arg3, "Ventrue");
else if (!str_cmp(arg3,"clear") )
{
free_string(ch->pcdata->cot_clans);
if (strlen(ch->clan) < 2)
ch->pcdata->cot_clans = str_dup( "Caitiff" );
else
ch->pcdata->cot_clans = str_dup( ch->clan );
send_to_char("Ok.\n\r",ch);
return;
}
else
{
send_to_char( "That is not a clan or a bloodline.\n\r", ch );
return;
}
if (is_name(arg3,ch->pcdata->cot_clans) ||
is_name("all",ch->pcdata->cot_clans))
{
send_to_char( "That clan is already allowed to join the coterie.\n\r", ch );
return;
}
if (strlen(ch->pcdata->cot_clans) > MAX_INPUT_LENGTH)
{
bug( "do_coterie: Too many clans.", 0 );
return;
}
strcpy(buf,ch->pcdata->cot_clans);
strcat(buf," ");
strcat(buf,arg3);
free_string(ch->pcdata->cot_clans);
ch->pcdata->cot_clans = str_dup(buf);
send_to_char("Ok.\n\r",ch);
return;
}
/* Specify which sects are permitted in the coterie. */
else if (!str_cmp(arg2,"sects"))
{
if (arg3[0] == '\0')
{
send_to_char("Please specify which sects are allowed in your coterie (clear to start over).\n\r",ch);
return;
}
if (!str_cmp(arg3,"all"))
{
send_to_char("Ok.\n\r",ch);
free_string(ch->pcdata->cot_sides);
ch->pcdata->cot_sides = str_dup( "All" );
return;
}
else if (!str_cmp(arg3,"anarch") ) strcpy(arg3, "Anarch");
else if (!str_cmp(arg3,"camarilla") ) strcpy(arg3, "Camarilla");
else if (!str_cmp(arg3,"sabbat") ) strcpy(arg3, "Sabbat");
else if (!str_cmp(arg3,"clear") )
{
free_string(ch->pcdata->cot_sides);
if (strlen(ch->side) < 2)
ch->pcdata->cot_sides = str_dup( "None" );
else
ch->pcdata->cot_sides = str_dup( ch->side );
send_to_char("Ok.\n\r",ch);
return;
}
else
{
send_to_char( "That is not a sect.\n\r", ch );
return;
}
if (is_name(arg3,ch->pcdata->cot_sides) ||
is_name("all",ch->pcdata->cot_sides))
{
send_to_char( "That sect is already allowed to join the coterie.\n\r", ch );
return;
}
if (strlen(ch->pcdata->cot_sides) > MAX_INPUT_LENGTH)
{
bug( "do_coterie: Too many sects.", 0 );
return;
}
strcpy(buf,ch->pcdata->cot_sides);
strcat(buf," ");
strcat(buf,arg3);
free_string(ch->pcdata->cot_sides);
ch->pcdata->cot_sides = str_dup(buf);
send_to_char("Ok.\n\r",ch);
return;
}
/* Specify how many hit points new members must have. */
else if (!str_cmp(arg2,"hp"))
{
if (arg3[0] == '\0')
{
send_to_char("Please specify the minimum number of hit points required.\n\r",ch);
return;
}
/* If arg3 isn't a number, then it shouldn't be valid. */
value = is_number( arg3 ) ? atoi( arg3 ) : -1;
if (value < 0)
{
send_to_char("Thats not a number!\n\r",ch);
return;
}
else if (value > 10000)
{
send_to_char("Please enter a number between 0 and 10000.\n\r",ch);
return;
}
/* You must be able to fulfill your own requirements. */
if (ch->hit < value)
{
sprintf(buf, "But you're only generation %d!\n\r",ch->vampgen);
send_to_char(buf,ch);
return;
}
ch->pcdata->cot_min[COT_HP] = value;
send_to_char("Ok.\n\r",ch);
return;
}
/* Specify what generation new members should be. */
else if (!str_cmp(arg2,"gen") || !str_cmp(arg2,"generation"))
{
int min_gen = 13;
if (ch->pcdata->cot_min[COT_EXPERT] > 0) min_gen = 7;
if (arg3[0] == '\0')
{
send_to_char("Please specify the highest generation permitted.\n\r",ch);
return;
}
/* If arg3 isn't a number, then it shouldn't be valid. */
value = is_number( arg3 ) ? atoi( arg3 ) : -1;
if (value < 0)
{
send_to_char("Thats not a number!\n\r",ch);
return;
}
else if (value < ch->vampgen || value > min_gen)
{
if (ch->vampgen == min_gen)
sprintf(buf, "Your coterie may only contain vampires who are generation %d.\n\r",ch->vampgen);
else
sprintf(buf, "Please enter a number between %d and %d.\n\r",ch->vampgen,min_gen);
send_to_char(buf,ch);
return;
}
/* You must be able to fulfill your own requirements. */
if (ch->vampgen > value)
{
sprintf(buf, "But you're only generation %d!\n\r",ch->vampgen);
send_to_char(buf,ch);
return;
}
ch->pcdata->cot_min[COT_GENERATION] = value;
send_to_char("Ok.\n\r",ch);
return;
}
/* Specify what weapon skill new members should have. */
else if (!str_cmp(arg2,"skill"))
{
if (arg3[0] == '\0')
{
send_to_char("Please specify the minimum amount of weapon skill required.\n\r",ch);
return;
}
/* If arg3 isn't a number, then it shouldn't be valid. */
value = is_number( arg3 ) ? atoi( arg3 ) : -1;
if (value < 0)
{
send_to_char("Thats not a number!\n\r",ch);
return;
}
else if (value > 200)
{
send_to_char("Please enter a number between 0 and 200.\n\r",ch);
return;
}
/* highest_skill is an int function which works out which of your
* weapon skills is the highest.
*/
if (highest_skill(ch) < value)
{
send_to_char("But you're not even that skilled yourself!\n\r",ch);
return;
}
ch->pcdata->cot_min[COT_SKILL] = value;
send_to_char("Ok.\n\r",ch);
return;
}
/* Specify what fighting stance ability new members should have. */
else if (!str_cmp(arg2,"stance"))
{
bool advanced = FALSE;
if (arg3[0] == '\0')
{
send_to_char("Please specify the minimum amount of stance ability required.\n\r",ch);
return;
}
/* If arg3 isn't a number, then it shouldn't be valid. */
value = is_number( arg3 ) ? atoi( arg3 ) : -1;
if (value < 0)
{
send_to_char("Thats not a number!\n\r",ch);
return;
}
else if (value > 200)
{
send_to_char("Please enter a number between 0 and 200.\n\r",ch);
return;
}
if (IS_SET(ch->pcdata->cot_min[COT_EXTRA], COT_ADV_STANCE))
advanced = TRUE;
/* highest_stance is an int function which works out which of your
* fighting stances is the highest. If the requirement is an
* advanced stance, then the second function parameter (advanced)
* will be TRUE, and the function will only check advanced fighting
* stances.
*/
if (highest_stance(ch, advanced) < value)
{
send_to_char("But you're not even that skilled yourself!\n\r",ch);
return;
}
ch->pcdata->cot_min[COT_STANCE] = value;
send_to_char("Ok.\n\r",ch);
return;
}
/* Specify discipline requirements of new members. */
else if (!str_cmp(arg2,"banned") ||
!str_cmp(arg2,"basic") || !str_cmp(arg2,"intermediate") ||
!str_cmp(arg2,"advanced") || !str_cmp(arg2,"expert"))
{
if (!str_cmp(arg2, "banned")) level = COT_BANNED;
else if (!str_cmp(arg2, "basic")) level = COT_BASIC;
else if (!str_cmp(arg2, "intermediate")) level = COT_INTERMEDIATE;
else if (!str_cmp(arg2, "advanced")) level = COT_ADVANCED;
else level = COT_EXPERT;
if (arg3[0] == '\0')
{
if (level == COT_BANNED)
sprintf(buf, "Please specify which disciplines are banned.\n\r");
else
sprintf(buf, "Please specify which disciplines are required at %s level.\n\r", capitalize(arg2));
send_to_char(buf,ch);
return;
}
/* From the input, calculate the values of:
* discipline: A bit used for the coterie requirements values.
* disc: An int, range 0-19, used for the players discipline array.
*/
if (!str_cmp(arg3,"animalism") )
{discipline = POW_ANIMALISM; disc = DISC_ANIMALISM;}
else if (!str_cmp(arg3,"auspex"))
{discipline = POW_AUSPEX; disc = DISC_AUSPEX;}
else if (!str_cmp(arg3,"celerity"))
{discipline = POW_CELERITY; disc = DISC_CELERITY;}
else if (!str_cmp(arg3,"chimerstry"))
{discipline = POW_CHIMERSTRY; disc = DISC_CHIMERSTRY;}
else if (!str_cmp(arg3,"daimoinon"))
{discipline = POW_DAIMOINON; disc = DISC_DAIMOINON;}
else if (!str_cmp(arg3,"dominate"))
{discipline = POW_DOMINATE; disc = DISC_DOMINATE;}
else if (!str_cmp(arg3,"fortitude"))
{discipline = POW_FORTITUDE; disc = DISC_FORTITUDE;}
else if (!str_cmp(arg3,"melpominee"))
{discipline = POW_MELPOMINEE; disc = DISC_MELPOMINEE;}
else if (!str_cmp(arg3,"necromancy"))
{discipline = POW_NECROMANCY; disc = DISC_NECROMANCY;}
else if (!str_cmp(arg3,"obeah"))
{discipline = POW_OBEAH; disc = DISC_OBEAH;}
else if (!str_cmp(arg3,"obfuscate"))
{discipline = POW_OBFUSCATE; disc = DISC_OBFUSCATE;}
else if (!str_cmp(arg3,"obtenebration"))
{discipline = POW_OBTENEBRATION; disc = DISC_OBTENEBRATION;}
else if (!str_cmp(arg3,"potence"))
{discipline = POW_POTENCE; disc = DISC_POTENCE;}
else if (!str_cmp(arg3,"presence"))
{discipline = POW_PRESENCE; disc = DISC_PRESENCE;}
else if (!str_cmp(arg3,"protean"))
{discipline = POW_PROTEAN; disc = DISC_PROTEAN;}
else if (!str_cmp(arg3,"quietus"))
{discipline = POW_QUIETUS; disc = DISC_QUIETUS;}
else if (!str_cmp(arg3,"serpentis"))
{discipline = POW_SERPENTIS; disc = DISC_SERPENTIS;}
else if (!str_cmp(arg3,"thanatosis"))
{discipline = POW_THANATOSIS; disc = DISC_THANATOSIS;}
else if (!str_cmp(arg3,"thaumaturgy"))
{discipline = POW_THAUMATURGY; disc = DISC_THAUMATURGY;}
else if (!str_cmp(arg3,"vicissitude"))
{discipline = POW_VICISSITUDE; disc = DISC_VICISSITUDE;}
else if (!str_cmp(arg3,"clear") )
{
ch->pcdata->cot_min[level] = POW_NONE;
send_to_char("Ok.\n\r",ch);
return;
}
else
{
send_to_char( "There is no such discipline.\n\r", ch );
return;
}
if (level == COT_EXPERT && disc == DISC_THAUMATURGY)
{
send_to_char( "There is no expert Thaumaturgy!\n\r", ch );
return;
}
/* You cannot ban a discipline from the coterie if you
* already know it!
*/
if (level == COT_BANNED && ch->pcdata->powers[disc] != 0)
{
sprintf(buf,"But you already know the %s discipline!\n\r",
capitalize(arg3));
send_to_char( buf, ch );
return;
}
/* You cannot set discipline requirements that you don't have
* yourself.
*/
if ((level == COT_BASIC && ch->pcdata->powers[disc] < 1) ||
(level == COT_INTERMEDIATE && ch->pcdata->powers[disc] < 3) ||
(level == COT_ADVANCED && ch->pcdata->powers[disc] < 5) ||
(level == COT_EXPERT && ch->pcdata->powers[disc] < 6))
{
arg2[0] = UPPER(arg2[0]); arg3[0] = UPPER(arg3[0]);
sprintf(buf,"But you don't have %s level %s!\n\r", arg2, arg3);
send_to_char( buf, ch );
return;
}
/*
if (IS_SET(ch->pcdata->cot_min[COT_BANNED], discipline))
{
REMOVE_BIT(ch->pcdata->cot_min[COT_BANNED], discipline);
send_to_char( "That discipline is no longer banned.\n\r", ch );
return;
}
if (IS_SET(ch->pcdata->cot_min[COT_BASIC], discipline) ||
IS_SET(ch->pcdata->cot_min[COT_INTERMEDIATE], discipline) ||
IS_SET(ch->pcdata->cot_min[COT_ADVANCED], discipline) ||
IS_SET(ch->pcdata->cot_min[COT_EXPERT], discipline))
{
send_to_char( "That discipline is already a coterie requirement.\n\r", ch );
return;
}
*/
if (IS_SET(ch->pcdata->cot_min[COT_BANNED], discipline))
REMOVE_BIT(ch->pcdata->cot_min[COT_BANNED], discipline);
if (IS_SET(ch->pcdata->cot_min[COT_BASIC], discipline))
REMOVE_BIT(ch->pcdata->cot_min[COT_BASIC], discipline);
if (IS_SET(ch->pcdata->cot_min[COT_INTERMEDIATE], discipline))
REMOVE_BIT(ch->pcdata->cot_min[COT_INTERMEDIATE], discipline);
if (IS_SET(ch->pcdata->cot_min[COT_ADVANCED], discipline))
REMOVE_BIT(ch->pcdata->cot_min[COT_ADVANCED], discipline);
if (IS_SET(ch->pcdata->cot_min[COT_EXPERT], discipline))
REMOVE_BIT(ch->pcdata->cot_min[COT_EXPERT], discipline);
/* Make sure a discipline cannot be both banned and required. */
REMOVE_BIT(ch->pcdata->cot_min[COT_BANNED], discipline);
REMOVE_BIT(ch->pcdata->cot_min[COT_BASIC], discipline);
REMOVE_BIT(ch->pcdata->cot_min[COT_INTERMEDIATE], discipline);
REMOVE_BIT(ch->pcdata->cot_min[COT_ADVANCED], discipline);
REMOVE_BIT(ch->pcdata->cot_min[COT_EXPERT], discipline);
SET_BIT(ch->pcdata->cot_min[level], discipline);
if (level == COT_EXPERT && ch->pcdata->cot_min[COT_GENERATION] > 7 )
ch->pcdata->cot_min[COT_GENERATION] = 7;
send_to_char("Ok.\n\r",ch);
return;
}
/* Specify if new members should have an advanced fighting stance. */
else if (!str_cmp(arg2,"adv_stance"))
{
value = ch->pcdata->cot_min[COT_STANCE];
/* Check that you have one yourself! */
if (highest_stance(ch, TRUE) < 1)
{
send_to_char("But you don't even have any advanced stances!\n\r",ch);
return;
}
/* Make sure your advanced stance is good enough. */
if (highest_stance(ch, TRUE) < value)
{
send_to_char("But you're not even that skilled yourself!\n\r",ch);
return;
}
if (IS_SET(ch->pcdata->cot_min[COT_EXTRA], COT_ADV_STANCE))
REMOVE_BIT(ch->pcdata->cot_min[COT_EXTRA], COT_ADV_STANCE);
else
SET_BIT(ch->pcdata->cot_min[COT_EXTRA], COT_ADV_STANCE);
send_to_char("Ok.\n\r",ch);
return;
}
/* Toggle if new members should have Golconda. */
else if (!str_cmp(arg2,"golconda"))
{
/* Golconda means ch->beast is 0. You've got to have
* Golconda yourself if you want other members to have it.
*/
if (ch->beast > 0)
{
send_to_char("But you don't even have Golconda yourself!\n\r",ch);
return;
}
if (IS_SET(ch->pcdata->cot_min[COT_EXTRA], COT_GOLCONDA))
REMOVE_BIT(ch->pcdata->cot_min[COT_EXTRA], COT_GOLCONDA);
else
SET_BIT(ch->pcdata->cot_min[COT_EXTRA], COT_GOLCONDA);
send_to_char("Ok.\n\r",ch);
return;
}
/* Toggle if new members must not have committed diablerie. */
else if (!str_cmp(arg2,"no_diablerie"))
{
if (ch->pcdata->diableries[DIAB_EVER] > 0)
{
send_to_char("But you've already committed diablerie!\n\r",ch);
return;
}
if (IS_SET(ch->pcdata->cot_min[COT_EXTRA], COT_NO_DIABLERIE))
REMOVE_BIT(ch->pcdata->cot_min[COT_EXTRA], COT_NO_DIABLERIE);
else
SET_BIT(ch->pcdata->cot_min[COT_EXTRA], COT_NO_DIABLERIE);
send_to_char("Ok.\n\r",ch);
return;
}
/* Toggle if new members must not kill other sect members. */
else if (!str_cmp(arg2,"no_kill_sect"))
{
if (IS_SET(ch->pcdata->cot_min[COT_EXTRA], COT_NO_KILL_SECT))
REMOVE_BIT(ch->pcdata->cot_min[COT_EXTRA], COT_NO_KILL_SECT);
else
SET_BIT(ch->pcdata->cot_min[COT_EXTRA], COT_NO_KILL_SECT);
send_to_char("Ok.\n\r",ch);
return;
}
/* Toggle if new members must not kill other coterie members. */
else if (!str_cmp(arg2,"no_kill_coterie"))
{
if (IS_SET(ch->pcdata->cot_min[COT_EXTRA], COT_NO_KILL_COTERIE))
REMOVE_BIT(ch->pcdata->cot_min[COT_EXTRA], COT_NO_KILL_COTERIE);
else
SET_BIT(ch->pcdata->cot_min[COT_EXTRA], COT_NO_KILL_COTERIE);
send_to_char("Ok.\n\r",ch);
return;
}
/* If you didn't enter any of the above, then list all the
* current rules as a default.
*/
else show_disc(ch);
return;
}
/* The 'coterie' command on its own lists the coterie options, unless
* you already belong to a coterie in which case you won't have reached
* this point.
*/
send_to_char("--------------------------------------------------------------------------------\n\r",ch);
send_to_char(" -= Coterie Options =-\n\r",ch);
send_to_char("--------------------------------------------------------------------------------\n\r",ch);
send_to_char("CHAMPION : Make a member into a champion.\n\r",ch);
send_to_char("FOUND : Founds a new Coterie.\n\r",ch);
send_to_char("INDUCT : Inducts a member into your coterie.\n\r",ch);
send_to_char("INFO : Lists information on your coterie.\n\r",ch);
send_to_char("LEAVE : Leaves your current Coterie.\n\r",ch);
send_to_char("OUTCAST : Outcasts a member from your coterie.\n\r",ch);
send_to_char("READY : Coterie rules are completed.\n\r",ch);
send_to_char("RULES : Lists the coterie rules.\n\r",ch);
send_to_char("--------------------------------------------------------------------------------\n\r",ch);
return;
}
void do_ctalk( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
DESCRIPTOR_DATA *d;
if ( IS_NPC(ch) ) return;
if ( !IS_VAMPIRE(ch) )
{
send_to_char("Huh?\n\r",ch);
return;
}
if ( strlen(ch->pcdata->coterie) < 2 || strlen(ch->pcdata->leader) < 2 )
{
send_to_char("But you don't belong to a coterie!\n\r",ch);
return;
}
if ( argument[0] == '\0' )
{
send_to_char("Coterie-talk what?\n\r",ch);
return;
}
if ( IS_MORE(ch, MORE_LEADER) )
act("-=$n=- '$t'.", ch, argument, NULL, TO_CHAR);
else
act("-$n- '$t'.", ch, argument, NULL, TO_CHAR);
for ( d = descriptor_list; d != NULL; d = d->next )
{
if ( d->connected != CON_PLAYING ) continue;
if ( (victim = d->character) == NULL ) continue;
if ( IS_NPC(victim) ) continue;
if ( !IS_VAMPIRE(victim) ) continue;
if ( strlen(victim->pcdata->coterie) < 2 ) continue;
if ( strlen(victim->pcdata->leader) < 2 ) continue;
if ( str_cmp(ch->pcdata->coterie, victim->pcdata->coterie ) ) continue;
if ( str_cmp(ch->pcdata->leader, victim->pcdata->leader ) ) continue;
if ( IS_MORE(ch, MORE_LEADER) )
act("-=$n=- '$t'.", ch, argument, victim, TO_VICT);
else
act("-$n- '$t'.", ch, argument, victim, TO_VICT);
}
return;
}
void do_shadowstep( 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_VAMPIRE(ch) && !IS_GHOUL(ch))
{
send_to_char( "Huh?\n\r", ch );
return;
}
if (arg[0] == '\0')
{
send_to_char( "Who do you wish to shadowstep to?\n\r", ch );
return;
}
if (get_disc(ch,DISC_OBTENEBRATION) < 5)
{
send_to_char("You require level 5 Obtenebration to use Shadow Step.\n\r",ch);
return;
}
if ( ( victim = get_char_world( ch, arg ) ) == NULL
|| victim == ch
|| victim->in_room == NULL
|| ch->in_room == NULL
|| (IS_NPC(victim) && !room_is_dark(victim->in_room))
|| victim->level > (get_disc(ch,DISC_OBTENEBRATION) * 10))
{
send_to_char( "Nothing happens.\n\r", ch );
return;
}
if ( victim->in_room == ch->in_room )
{
send_to_char( "But you are already there!\n\r", ch );
return;
}
if ( 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->position != POS_STANDING
|| (!IS_NPC(victim) && !IS_IMMUNE(victim, IMM_SUMMON) ) )
{
send_to_char( "You are unable to focus on their location.\n\r", ch );
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to use Summoning on you.",ch,NULL,victim,TO_VICT);
}
return;
}
send_to_char("You step into the shadows.\n\r",ch);
act("$n steps into the shadows and vanishes from sight.",ch,NULL,NULL,TO_ROOM);
char_from_room(ch);
char_to_room(ch,victim->in_room);
do_look(ch,"");
send_to_char("You step out of the shadows.\n\r",ch);
act("$N steps from the shadows.",victim,NULL,ch,TO_CHAR);
act("$N steps from the shadows.",victim,NULL,ch,TO_ROOM);
return;
}
void do_hand( CHAR_DATA *ch, char *argument )
{
if (IS_NPC(ch)) return;
if (!IS_DEMON(ch))
{
if (!IS_WEREWOLF(ch) || get_auspice(ch, AUSPICE_AHROUN) < 5)
{
send_to_char("Huh?\n\r",ch);
return;
}
}
if (IS_MORE(ch,MORE_HAND_FLAME) )
{
if (IS_ANGEL(ch))
{
send_to_char("The glowing blue nimbus around your hands fades away.\n\r",ch);
act("The glowing blue nimbus around $n's hands fades away.", ch, NULL, NULL, TO_ROOM);
}
else
{
send_to_char("The flames around your hands are extinguished.\n\r",ch);
act("The flames around $n's hands die away.", ch, NULL, NULL, TO_ROOM);
}
REMOVE_BIT(ch->more, MORE_HAND_FLAME);
if ( ch->in_room != NULL && ch->in_room->light > 0 )
--ch->in_room->light;
return;
}
if (IS_ANGEL(ch))
{
send_to_char("Your hands begin to glow with a blue nimbus.\n\r",ch);
act("$n's hands begin to blue with a blue nimbus.",ch,NULL,NULL,TO_ROOM);
}
else
{
send_to_char("Your hands erupts into flames.\n\r",ch);
act("$n's hands erupts into flames.",ch,NULL,NULL,TO_ROOM);
}
SET_BIT(ch->more, MORE_HAND_FLAME);
if ( ch->in_room != NULL ) ++ch->in_room->light;
return;
}
void do_flamebolt( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
int dam, hp, sn;
char arg[MAX_INPUT_LENGTH];
one_argument( argument, arg );
if (IS_NPC(ch)) return;
if (!IS_DEMON(ch) || IS_ANGEL(ch))
{
send_to_char("Huh?\n\r",ch);
return;
}
if (IS_ITEMAFF(ch, ITEMA_PEACE)) do_majesty(ch,"");
if (arg[0] == '\0' && ch->fighting == NULL)
{
send_to_char( "Who do you wish to shoot a Flame Bolt at?\n\r", ch );
return;
}
if ( ( victim = ch->fighting ) == NULL )
{
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
}
if ( is_safe(ch, victim) )
{
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to use Engulf on you.",ch,NULL,victim,TO_VICT);
}
return;
}
if ( ch == victim )
{
send_to_char( "Now that would be just plain stupid.\n\r", ch );
return;
}
if ( ( sn = skill_lookup( "flame bolt" ) ) < 0 )
{
send_to_char( "Bug - please inform KaVir.\n\r", ch );
return;
}
act( "A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM );
if (IS_ITEMAFF(victim, ITEMA_FIRESHIELD))
{
send_to_char("Nothing happens.\n\r",ch);
WAIT_STATE(ch, 6);
return;
}
if (!IS_NPC(victim) && victim->pcdata->atm >= number_percent())
{
send_to_char("Nothing happens.\n\r",ch);
WAIT_STATE(ch, 6);
return;
}
dam = number_range(500,1000);
hp = victim->hit;
if (!IS_NPC(victim) && IS_VAMPIRE(victim) )
damage( ch, victim, (dam*2), (sn + TYPE_ADD_AGG) );
else
damage( ch, victim, dam, (sn + TYPE_ADD_AGG) );
WAIT_STATE(ch, 6);
if (victim == NULL || victim->position == POS_DEAD) return;
if (!IS_NPC(victim) && IS_IMMUNE(victim, IMM_HEAT) )
{victim->hit = hp;victim->agg--;}
else if (!IS_NPC(victim) && IS_VAMPIRE(victim) && get_disc(victim,DISC_DAIMOINON) > 5)
{victim->hit = hp;victim->agg--;}
else if (!IS_NPC(victim) && IS_WEREWOLF(victim) && get_auspice(victim,AUSPICE_AHROUN) > 4)
{victim->hit = hp;victim->agg--;}
update_pos(victim);
return;
}
void do_engulf( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
int dam, hp, sn;
char arg[MAX_INPUT_LENGTH];
one_argument( argument, arg );
if (IS_NPC(ch)) return;
if (!IS_DEMON(ch) || IS_ANGEL(ch))
{
send_to_char("Huh?\n\r",ch);
return;
}
if (IS_ITEMAFF(ch, ITEMA_PEACE)) do_majesty(ch,"");
if (arg[0] == '\0' && ch->fighting == NULL)
{
send_to_char( "Who do you wish to Engulf?\n\r", ch );
return;
}
if ( ( victim = ch->fighting ) == NULL )
{
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
}
if ( is_safe(ch, victim) )
{
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to use Engulf on you.",ch,NULL,victim,TO_VICT);
}
return;
}
if ( ch == victim )
{
send_to_char( "Now that would be just plain stupid.\n\r", ch );
return;
}
if ( ( sn = skill_lookup( "flame bolt" ) ) < 0 )
{
send_to_char( "Bug - please inform KaVir.\n\r", ch );
return;
}
act( "A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM );
if (IS_ITEMAFF(victim, ITEMA_FIRESHIELD))
{
send_to_char("Nothing happens.\n\r",ch);
WAIT_STATE(ch, 6);
return;
}
if (!IS_NPC(victim) && victim->pcdata->atm >= number_percent())
{
send_to_char("Nothing happens.\n\r",ch);
WAIT_STATE(ch, 6);
return;
}
dam = number_range(500,1000);
hp = victim->hit;
if (!IS_NPC(victim) && IS_VAMPIRE(victim) )
damage( ch, victim, (dam*2), (sn + TYPE_ADD_AGG) );
else
damage( ch, victim, dam, (sn + TYPE_ADD_AGG) );
WAIT_STATE(ch, 6);
if (victim == NULL || victim->position == POS_DEAD) return;
if (!IS_NPC(victim) && IS_IMMUNE(victim, IMM_HEAT) )
{victim->hit = hp;victim->agg--;}
else if (!IS_NPC(victim) && IS_VAMPIRE(victim) && get_disc(victim,DISC_DAIMOINON) > 5)
{victim->hit = hp;victim->agg--;}
else if (!IS_NPC(victim) && IS_WEREWOLF(victim) && get_auspice(victim,AUSPICE_AHROUN) > 4)
{victim->hit = hp;victim->agg--;}
else if (!IS_AFFECTED(victim, AFF_FLAMING))
{
send_to_char("You are engulfed in flames!\n\r",victim);
act("$n is engulfed in flames!",victim,NULL,NULL,TO_ROOM);
SET_BIT(victim->affected_by, AFF_FLAMING);
}
update_pos(victim);
return;
}
void do_evileye( CHAR_DATA *ch, char *argument )
{
char buf[MAX_STRING_LENGTH];
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
int value;
smash_tilde( argument );
argument = one_argument( argument, arg1 );
strcpy( arg2, argument );
if (IS_NPC(ch)) return;
if (!IS_VAMPIRE(ch))
{
send_to_char("Huh?\n\r",ch);
return;
}
if ( arg1[0] != '\0' && !str_cmp( arg1, "on" ) )
{
if (IS_MORE(ch, MORE_EVILEYE))
{
send_to_char("You already have Evil Eye on.\n\r",ch);
return;
}
send_to_char("Your Evil Eye is now ON.\n\r",ch);
SET_BIT(ch->more, MORE_EVILEYE);
return;
}
if ( arg1[0] != '\0' && !str_cmp( arg1, "off" ) )
{
if (!IS_MORE(ch, MORE_EVILEYE))
{
send_to_char("You already have Evil Eye off.\n\r",ch);
return;
}
send_to_char("Your Evil Eye is now OFF.\n\r",ch);
REMOVE_BIT(ch->more, MORE_EVILEYE);
return;
}
if ( arg1[0] == '\0' || arg2[0] == '\0' )
{
send_to_char("--------------------------------------------------------------------------------\n\r",ch);
send_to_char(" -= Evil Eye =-\n\r",ch);
send_to_char("--------------------------------------------------------------------------------\n\r",ch);
send_to_char( "Format is: evileye <option> <value>\n\r", ch );
send_to_char("--------------------------------------------------------------------------------\n\r",ch);
send_to_char( "Option ON switches your Evil Eye on.\n\r", ch );
send_to_char( "Option OFF switches your Evil Eye off.\n\r", ch );
send_to_char( "Option ACTION is a text string action performed by you or the viewer.\n\r", ch );
send_to_char( "Option MESSAGE is a text string shown to the person looking at you.\n\r", ch );
send_to_char( "Option TOGGLE has values: Spell, Self, Other.\n\r", ch );
send_to_char("--------------------------------------------------------------------------------\n\r",ch);
if ( strlen(ch->poweraction) < 2 )
sprintf(buf,"Current Action: None.\n\r");
else
sprintf(buf,"Current Action: %s.\n\r",ch->poweraction);
send_to_char(buf,ch);
if ( strlen(ch->powertype) < 2 )
sprintf(buf,"Current Message: None.\n\r");
else
sprintf(buf,"Current Message: %s.\n\r",ch->powertype);
send_to_char(buf,ch);
send_to_char("Current Toggle flags:",ch);
if (IS_SET(ch->spectype,EYE_SPELL)) send_to_char(" Spell",ch);
if (IS_SET(ch->spectype,EYE_SELFACTION)) send_to_char(" Self",ch);
if (IS_SET(ch->spectype,EYE_ACTION)) send_to_char(" Other",ch);
if (!IS_SET(ch->spectype,EYE_SPELL) &&
!IS_SET(ch->spectype,EYE_SELFACTION) &&
!IS_SET(ch->spectype,EYE_ACTION)) send_to_char(" None",ch);
send_to_char(".\n\r",ch);
send_to_char("--------------------------------------------------------------------------------\n\r",ch);
return;
}
value = is_number( arg2 ) ? atoi( arg2 ) : -1;
if ( !str_cmp( arg1, "action" ) )
{
if (is_in(arg2,"|quit*rem*drop*gift*claim*consent*propose*accept*vampi*ma *maj*sid *side *reca*/*l *lo *loo *look *exa*ha *hav *have *haven*"))
{
send_to_char("Illegal action type.\n\r",ch);
return;
}
if (strlen(arg2) > 80)
{
send_to_char("Action too long, please limit it to 80 characters.\n\r",ch);
return;
}
if (!str_cmp(arg2,"clear"))
{
free_string( ch->poweraction );
ch->poweraction = str_dup( "" );
send_to_char("Action cleared.\n\r",ch);
return;
}
free_string( ch->poweraction );
ch->poweraction = str_dup( arg2 );
send_to_char("Action set.\n\r",ch);
return;
}
else if ( !str_cmp( arg1, "message" ) )
{
if (strlen(arg2) > 80)
{
send_to_char("Message too long, please limit it to 80 characters.\n\r",ch);
return;
}
if (!str_cmp(arg2,"clear"))
{
free_string( ch->powertype );
ch->powertype = str_dup( "" );
send_to_char("Message cleared.\n\r",ch);
return;
}
free_string( ch->powertype );
ch->powertype = str_dup( arg2 );
send_to_char("Message set.\n\r",ch);
return;
}
else if ( !str_cmp( arg1, "toggle" ) )
{
if ( !str_cmp( arg2, "spell" ) && IS_SET(ch->spectype,EYE_SPELL))
REMOVE_BIT(ch->spectype,EYE_SPELL);
else if ( !str_cmp( arg2, "spell" ) && !IS_SET(ch->spectype,EYE_SPELL))
SET_BIT(ch->spectype,EYE_SPELL);
else if ( !str_cmp( arg2, "self" ) && IS_SET(ch->spectype,EYE_SELFACTION))
REMOVE_BIT(ch->spectype,EYE_SELFACTION);
else if ( !str_cmp( arg2, "self" ) && !IS_SET(ch->spectype,EYE_SELFACTION))
SET_BIT(ch->spectype,EYE_SELFACTION);
else if ( !str_cmp( arg2, "other" ) && IS_SET(ch->spectype,EYE_ACTION))
REMOVE_BIT(ch->spectype,EYE_ACTION);
else if ( !str_cmp( arg2, "other" ) && !IS_SET(ch->spectype,EYE_ACTION))
SET_BIT(ch->spectype,EYE_ACTION);
else {
send_to_char("TOGGLE flag should be one of: spell, self, other.\n\r",ch);
return;}
sprintf(buf,"%s flag toggled.\n\r",capitalize(arg2));
send_to_char(buf,ch);
return;
}
else
{
send_to_char("--------------------------------------------------------------------------------\n\r",ch);
send_to_char(" -= Evil Eye =-\n\r",ch);
send_to_char("--------------------------------------------------------------------------------\n\r",ch);
send_to_char( "Format is: evileye <option> <value>\n\r", ch );
send_to_char("--------------------------------------------------------------------------------\n\r",ch);
send_to_char( "Option ACTION is a text string action performed by you or the viewer.\n\r", ch );
send_to_char( "Option MESSAGE is a text string shown to the person looking at you.\n\r", ch );
send_to_char( "Option TOGGLE has values: Spell, Self, Other.\n\r", ch );
send_to_char("--------------------------------------------------------------------------------\n\r",ch);
if ( strlen(ch->poweraction) < 2 )
sprintf(buf,"Current Action: None.\n\r");
else
sprintf(buf,"Current Action: %s.\n\r",ch->poweraction);
send_to_char(buf,ch);
if ( strlen(ch->powertype) < 2 )
sprintf(buf,"Current Message: None.\n\r");
else
sprintf(buf,"Current Message: %s.\n\r",ch->powertype);
send_to_char(buf,ch);
send_to_char("Current Toggle flags:",ch);
if (IS_SET(ch->spectype,EYE_SPELL)) send_to_char(" Spell",ch);
if (IS_SET(ch->spectype,EYE_SELFACTION)) send_to_char(" Self",ch);
if (IS_SET(ch->spectype,EYE_ACTION)) send_to_char(" Other",ch);
if (!IS_SET(ch->spectype,EYE_SPELL) &&
!IS_SET(ch->spectype,EYE_SELFACTION) &&
!IS_SET(ch->spectype,EYE_ACTION)) send_to_char(" None",ch);
send_to_char(".\n\r",ch);
send_to_char("--------------------------------------------------------------------------------\n\r",ch);
}
return;
}
void do_spiriteyes( CHAR_DATA *ch, char *argument )
{
char arg [MAX_INPUT_LENGTH];
argument = one_argument( argument, arg );
if (IS_NPC(ch)) return;
if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch) )
{
send_to_char("Huh?\n\r",ch);
return;
}
if (get_disc(ch,DISC_NECROMANCY) < 1)
{
send_to_char("You require level 1 Necromancy to use Spirit Eyes.\n\r",ch);
return;
}
if (IS_VAMPAFF(ch,VAM_SPIRITEYES) )
{
send_to_char("You can no longer see into the shadowlands.\n\r",ch);
REMOVE_BIT(ch->vampaff, VAM_SPIRITEYES);
return;
}
send_to_char("You can now see into the shadowlands.\n\r",ch);
SET_BIT(ch->vampaff, VAM_SPIRITEYES);
return;
}
void do_stake( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
CHAR_DATA *vch;
OBJ_DATA *stake;
OBJ_DATA *obj;
char arg [MAX_INPUT_LENGTH];
argument = one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "Stake whom?\n\r", ch );
return;
}
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
if ( ( obj = get_obj_here( ch, arg ) ) != NULL )
{
if ( obj->item_type == ITEM_CORPSE_NPC )
{
send_to_char("They have no stake in them to remove.\n\r",ch);
return;
}
if ( obj->item_type != ITEM_CORPSE_PC )
{
if (obj->chobj == NULL || obj->chobj != ch)
send_to_char("How can you remove a stake from THAT?\n\r",ch);
else
send_to_char("There is no stake for you to remove.\n\r",ch);
return;
}
if ( ( victim = obj->chobj ) == NULL )
{
send_to_char("There is no stake for you to remove.\n\r",ch);
return;
}
if ( ( stake = get_eq_char( victim, WEAR_STAKE ) ) == NULL )
{
send_to_char("There is no stake for you to remove.\n\r",ch);
return;
}
if (!IS_EXTRA(victim, EXTRA_OSWITCH) || !IS_MORE(victim, MORE_STAKED))
{
send_to_char("There is no stake for you to remove.\n\r",ch);
return;
}
else
{
REMOVE_BIT(victim->more, MORE_STAKED);
victim->pcdata->obj_vnum = 0;
obj->chobj = NULL;
victim->pcdata->chobj = NULL;
REMOVE_BIT(victim->affected_by, AFF_POLYMORPH);
REMOVE_BIT(victim->extra, EXTRA_OSWITCH);
free_string(victim->morph);
victim->morph = str_dup("");
if (victim == ch)
{
act("You pull $p out of your heart.", ch, stake, victim, TO_CHAR);
act("$n pulls $p out of $s chest.", ch, stake, victim, TO_ROOM);
}
else
{
act("You pull $p out of $N's heart.", ch, stake, victim, TO_CHAR);
act("$n pulls $p out of $N's chest.", ch, stake, victim, TO_NOTVICT);
send_to_char( "You feel the stake pulled from your heart.\n\r", victim );
}
obj_from_char(stake);
obj_to_char(stake,ch);
stake->timer = -1;
if (obj->carried_by != NULL)
{
if (victim != obj->carried_by)
{
act("You drop $N onto the floor.", obj->carried_by, NULL, victim, TO_CHAR);
act("$n drops $N onto the floor.", obj->carried_by, NULL, victim, TO_NOTVICT);
act("$n drops you onto the floor.", obj->carried_by, NULL, victim, TO_VICT);
}
}
act("$n clambers to $s feet.",victim,NULL,NULL,TO_ROOM);
act("You clamber back to your feet.",victim,NULL,NULL,TO_CHAR);
extract_obj(obj);
if (victim->in_room->vnum == ROOM_VNUM_IN_OBJECT)
{
char_from_room(victim);
char_to_room(victim,get_room_index(ROOM_VNUM_HELL));
}
}
return;
}
send_to_char( "They aren't here.\n\r", ch );
return;
}
if ( ( stake = get_eq_char( victim, WEAR_STAKE ) ) != NULL )
{
if (victim == ch)
{
act("You pull $p out of your heart.", ch, stake, victim, TO_CHAR);
act("$n pulls $p out of $s chest.", ch, stake, victim, TO_ROOM);
}
else if (!IS_IMMUNE(victim,IMM_VAMPIRE))
send_to_char("They refuse to let you near them.\n\r",ch);
else
{
act("You pull $p out of $N's heart.", ch, stake, victim, TO_CHAR);
act("$n pulls $p out of $N's chest.", ch, stake, victim, TO_NOTVICT);
act("$n pulls $p out of your chest.", ch, stake, victim, TO_VICT);
}
obj_from_char(stake);
obj_to_char(stake,ch);
return;
}
stake = get_eq_char( ch, WEAR_HOLD );
if ( stake == NULL || stake->item_type != ITEM_STAKE )
{
stake = get_eq_char( ch, WEAR_WIELD );
if ( stake == NULL || stake->item_type != ITEM_STAKE )
{
send_to_char( "How can you stake someone down without holding a stake?\n\r", ch );
return;
}
}
if ( IS_NPC(victim) )
{
send_to_char( "Not on NPC's.\n\r", ch );
return;
}
if ( ch == victim )
{
send_to_char( "You cannot stake yourself.\n\r", ch );
return;
}
if (!IS_VAMPIRE(victim))
{
send_to_char( "You can only stake vampires.\n\r", ch );
return;
}
if (victim->position > POS_MORTAL)
{
send_to_char( "You can only stake a vampire who is in torpor.\n\r", ch );
return;
}
if (get_eq_char(victim, WEAR_STAKE) != NULL)
{
send_to_char( "But they already have a stake through their chest!\n\r", ch );
return;
}
if ( is_safe(ch, victim) ) return;
act("You raise $p over $N's chest.", ch, stake, victim, TO_CHAR);
act("$n raises $p over $N's chest.", ch, stake, victim, TO_NOTVICT);
if (IS_MORE(victim, MORE_DEFLECTION))
{
act("$p explodes into tiny fragments in your hand.", ch, stake, NULL, TO_CHAR);
act("$p explodes into tiny fragments in $n's hand.", ch, stake, victim, TO_ROOM);
REMOVE_BIT(victim->more, MORE_DEFLECTION);
extract_obj(stake);
send_to_char("You fall to the ground, stunned.\n\r",ch);
act("$n falls to the ground, stunned.", ch, NULL, NULL, TO_ROOM);
ch->position = POS_STUNNED;
return;
}
act("You plunge $p into $N's heart.", ch, stake, victim, TO_CHAR);
act("$n plunges $p into $N's heart.", ch, stake, victim, TO_NOTVICT);
if ( ( vch = victim->embrace ) != NULL )
{
vch->embrace = NULL;
vch->embraced = ARE_NONE;
}
victim->embrace = NULL;
victim->embraced = ARE_NONE;
obj_from_char(stake);
obj_to_char(stake,victim);
equip_char(victim, stake, WEAR_STAKE);
if (IS_IMMUNE(victim,IMM_STAKE))
{
send_to_char( "You feel a stake plunged through your chest.\n\r", victim );
return;
}
stake->timer = (0.05 * victim->beast) + 1;
send_to_char( "You feel a stake plunged through your heart.\n\r", victim );
victim->pcdata->wolf = 0;
if (IS_WEREWOLF(victim)) do_unwerewolf(victim,"");
if (IS_VAMPAFF(victim, VAM_NIGHTSIGHT) && !IS_POLYAFF(victim, POLY_ZULO))
do_nightsight(victim,"");
if (IS_VAMPAFF(victim, VAM_FANGS) && !IS_POLYAFF(victim, POLY_ZULO))
do_fangs(victim,"");
if (IS_VAMPAFF(victim, VAM_CLAWS) && !IS_POLYAFF(victim, POLY_ZULO))
do_claws(victim,"");
mortal_vamp(victim);
if (IS_AFFECTED(ch,AFF_POLYMORPH)) clear_stats(victim);
if ((obj = create_object(get_obj_index(OBJ_VNUM_CORPSE_PC),0)) == NULL)
{
send_to_char( "Bug - please inform KaVir.\n\r", ch );
return;
}
victim->hit = 1;
victim->position = POS_STANDING;
staked_corpse(victim,obj);
if (victim->mounted == IS_RIDING) do_dismount(victim,"");
obj_to_room(obj,victim->in_room);
victim->pcdata->obj_vnum = OBJ_VNUM_CORPSE_PC;
obj->chobj = victim;
victim->pcdata->chobj = obj;
SET_BIT(victim->more, MORE_STAKED);
SET_BIT(victim->affected_by, AFF_POLYMORPH);
SET_BIT(victim->extra, EXTRA_OSWITCH);
free_string(victim->morph);
victim->morph = str_dup(obj->short_descr);
return;
}
void ritual_ward( CHAR_DATA *ch, int direction, int ward )
{
OBJ_DATA *obj;
EXIT_DATA *pexit;
ROOM_INDEX_DATA *location;
ROOM_INDEX_DATA *to_room;
char arg [MAX_INPUT_LENGTH];
char buf [MAX_INPUT_LENGTH];
int duration = number_range(1,2) * 15;
int rev;
if (IS_NPC(ch)) return;
if (ward != EX_WARD_GHOULS &&
ward != EX_WARD_LUPINES &&
ward != EX_WARD_KINDRED &&
ward != EX_WARD_SPIRITS )
{
send_to_char( "Bug - Please inform KaVir.\n\r", ch );
return;
}
if (direction == DIR_NORTH) rev = DIR_SOUTH;
else if (direction == DIR_SOUTH) rev = DIR_NORTH;
else if (direction == DIR_EAST) rev = DIR_WEST;
else if (direction == DIR_WEST) rev = DIR_EAST;
else if (direction == DIR_UP) rev = DIR_DOWN;
else if (direction == DIR_DOWN) rev = DIR_UP;
else
{
send_to_char( "Bug - Please inform KaVir.\n\r", ch );
return;
}
switch (direction)
{
default: strcpy(arg,"north"); break;
case DIR_NORTH: strcpy(arg,"north"); break;
case DIR_SOUTH: strcpy(arg,"south"); break;
case DIR_EAST: strcpy(arg,"east"); break;
case DIR_WEST: strcpy(arg,"west"); break;
case DIR_UP: strcpy(arg,"up"); break;
case DIR_DOWN: strcpy(arg,"down"); break;
}
if ( ( pexit = ch->in_room->exit[direction] ) == NULL )
{
send_to_char("Nothing happens.\n\r",ch);
return;
}
if ( ( location = ch->in_room ) == NULL )
{
send_to_char("Nothing happens.\n\r",ch);
return;
}
if ( ( to_room = pexit->to_room ) == NULL )
{
send_to_char("Nothing happens.\n\r",ch);
return;
}
if (IS_SET(pexit->exit_info, EX_WARD_GHOULS) ||
IS_SET(pexit->exit_info, EX_WARD_LUPINES) ||
IS_SET(pexit->exit_info, EX_WARD_KINDRED) ||
IS_SET(pexit->exit_info, EX_WARD_SPIRITS) )
{
send_to_char("Nothing happens.\n\r",ch);
return;
}
act( "A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM );
obj = create_object( get_obj_index( OBJ_VNUM_PORTAL ), 0 );
obj->item_type = ITEM_WARD;
obj->value[0] = direction;
obj->timer = duration;
free_string(obj->name);
obj->name = str_dup("ward");
free_string(obj->short_descr);
if (ward == EX_WARD_GHOULS)
obj->short_descr = str_dup("a Ward vs Ghouls");
else if (ward == EX_WARD_LUPINES)
obj->short_descr = str_dup("a Ward vs Lupines");
else if (ward == EX_WARD_KINDRED)
obj->short_descr = str_dup("a Ward vs Kindred");
else
obj->short_descr = str_dup("a Ward vs Spirits");
if (direction == DIR_UP)
sprintf(buf,"A small ward is drawn in the centre of the ceiling.");
else if (direction == DIR_DOWN)
sprintf(buf,"A small ward is drawn in the centre of the floor.");
else
sprintf(buf,"A small ward is drawn on the floor to the %s.",arg);
free_string(obj->description);
obj->description = str_dup(buf);
obj_to_room( obj, ch->in_room );
SET_BIT(pexit->exit_info, ward);
if (direction == DIR_UP)
{
act( "You carefully draw $p in the centre of the ceiling.", ch, obj, NULL, TO_CHAR );
act( "$n carefully draws $p in the centre of the ceiling.", ch, obj, NULL, TO_ROOM );
}
else if (direction == DIR_DOWN)
{
act( "You carefully draw $p in the centre of the floor.", ch, obj, NULL, TO_CHAR );
act( "$n carefully draws $p in the centre of the floor.", ch, obj, NULL, TO_ROOM );
}
else
{
sprintf(buf,"You carefully draw $p on the floor to the %s.",arg);
act( buf, ch, obj, NULL, TO_CHAR );
sprintf(buf,"$n carefully draws $p on the floor to the %s.",arg);
act( buf, ch, obj, NULL, TO_ROOM );
}
WAIT_STATE(ch,12);
if (location == to_room) return;
char_from_room(ch);
char_to_room(ch, to_room);
if ( ( pexit = ch->in_room->exit[rev] ) == NULL ) return;
if (IS_SET(pexit->exit_info, ward)) return;
switch (rev)
{
default: strcpy(arg,"north"); break;
case DIR_NORTH: strcpy(arg,"north"); break;
case DIR_SOUTH: strcpy(arg,"south"); break;
case DIR_EAST: strcpy(arg,"east"); break;
case DIR_WEST: strcpy(arg,"west"); break;
case DIR_UP: strcpy(arg,"up"); break;
case DIR_DOWN: strcpy(arg,"down"); break;
}
obj = create_object( get_obj_index( OBJ_VNUM_PORTAL ), 0 );
obj->item_type = ITEM_WARD;
obj->value[0] = rev;
obj->timer = duration;
free_string(obj->name);
obj->name = str_dup("ward");
free_string(obj->short_descr);
if (ward == EX_WARD_GHOULS)
obj->short_descr = str_dup("a Ward vs Ghouls");
else if (ward == EX_WARD_LUPINES)
obj->short_descr = str_dup("a Ward vs Lupines");
else if (ward == EX_WARD_KINDRED)
obj->short_descr = str_dup("a Ward vs Kindred");
else
obj->short_descr = str_dup("a Ward vs Spirits");
free_string(obj->description);
obj->description = str_dup("");
obj_to_room( obj, ch->in_room );
SET_BIT(pexit->exit_info, ward);
char_from_room(ch);
char_to_room(ch, location);
return;
}
void show_disc( CHAR_DATA *ch )
{
char buf [MAX_STRING_LENGTH];
int level;
if (IS_NPC(ch) || !IS_VAMPIRE(ch)) return;
send_to_char("--------------------------------------------------------------------------------\n\r",ch);
send_to_char(" -= Coterie Rules =-\n\r",ch);
send_to_char("--------------------------------------------------------------------------------\n\r",ch);
if (IS_MORE(ch, MORE_LEADER) && !IS_MORE(ch, MORE_CHAMPION))
{
send_to_char( "Syntax: coterie rules <option>\n\r", ch );
send_to_char( "Option can be any one of the following: \n\r", ch );
send_to_char( "Clans Sects Banned Basic Intermediate Advanced Expert Hp Generation Skill \n\r", ch );
send_to_char( "Stance Adv_Stance Golconda No_Diablerie No_Kill_Sect No_Kill_Coterie.\n\r", ch );
send_to_char("--------------------------------------------------------------------------------\n\r",ch);
}
sprintf( buf, "Sects allowed to join: %s.\n\r",ch->pcdata->cot_sides);
send_to_char(buf,ch);
sprintf( buf, "Clans allowed to join: %s.\n\r",ch->pcdata->cot_clans);
send_to_char(buf,ch);
for (level = COT_BANNED; level <= COT_EXPERT; level++)
{
switch (level)
{
default: break;
case COT_BANNED:
if ((IS_MORE(ch, MORE_LEADER) && !IS_MORE(ch, MORE_CHAMPION))
|| ch->pcdata->cot_min[level] > POW_NONE)
send_to_char("Banned disciplines:",ch);
break;
case COT_BASIC:
if ((IS_MORE(ch, MORE_LEADER) && !IS_MORE(ch, MORE_CHAMPION))
|| ch->pcdata->cot_min[level] > POW_NONE)
send_to_char("Basic disciplines required (Level 1+):",ch);
break;
case COT_INTERMEDIATE:
if ((IS_MORE(ch, MORE_LEADER) && !IS_MORE(ch, MORE_CHAMPION))
|| ch->pcdata->cot_min[level] > POW_NONE)
send_to_char("Intermediate disciplines required (Level 3+):",ch);
break;
case COT_ADVANCED:
if ((IS_MORE(ch, MORE_LEADER) && !IS_MORE(ch, MORE_CHAMPION))
|| ch->pcdata->cot_min[level] > POW_NONE)
send_to_char("Advanced disciplines required (Level 5+):",ch);
break;
case COT_EXPERT:
if ((IS_MORE(ch, MORE_LEADER) && !IS_MORE(ch, MORE_CHAMPION))
|| ch->pcdata->cot_min[level] > POW_NONE)
send_to_char("Expert disciplines required (Level 6+):",ch);
break;
}
if (IS_MORE(ch, MORE_LEADER) && !IS_MORE(ch, MORE_CHAMPION) &&
ch->pcdata->cot_min[level] <= POW_NONE)
{
send_to_char(" None.\n\r",ch);
continue;
}
if (IS_SET(ch->pcdata->cot_min[level], POW_ANIMALISM))
send_to_char(" Animalism",ch);
if (IS_SET(ch->pcdata->cot_min[level], POW_AUSPEX))
send_to_char(" Auspex",ch);
if (IS_SET(ch->pcdata->cot_min[level], POW_CELERITY))
send_to_char(" Celerity",ch);
if (IS_SET(ch->pcdata->cot_min[level], POW_CHIMERSTRY))
send_to_char(" Chimerstry",ch);
if (IS_SET(ch->pcdata->cot_min[level], POW_DAIMOINON))
send_to_char(" Daimoinon",ch);
if (IS_SET(ch->pcdata->cot_min[level], POW_DOMINATE))
send_to_char(" Dominate",ch);
if (IS_SET(ch->pcdata->cot_min[level], POW_FORTITUDE))
send_to_char(" Fortitude",ch);
if (IS_SET(ch->pcdata->cot_min[level], POW_MELPOMINEE))
send_to_char(" Melpominee",ch);
if (IS_SET(ch->pcdata->cot_min[level], POW_NECROMANCY))
send_to_char(" Necromancy",ch);
if (IS_SET(ch->pcdata->cot_min[level], POW_OBEAH))
send_to_char(" Obeah",ch);
if (IS_SET(ch->pcdata->cot_min[level], POW_OBFUSCATE))
send_to_char(" Obfuscate",ch);
if (IS_SET(ch->pcdata->cot_min[level], POW_OBTENEBRATION))
send_to_char(" Obtenebration",ch);
if (IS_SET(ch->pcdata->cot_min[level], POW_POTENCE))
send_to_char(" Potence",ch);
if (IS_SET(ch->pcdata->cot_min[level], POW_PRESENCE))
send_to_char(" Presence",ch);
if (IS_SET(ch->pcdata->cot_min[level], POW_PROTEAN))
send_to_char(" Protean",ch);
if (IS_SET(ch->pcdata->cot_min[level], POW_QUIETUS))
send_to_char(" Quietus",ch);
if (IS_SET(ch->pcdata->cot_min[level], POW_SERPENTIS))
send_to_char(" Serpentis",ch);
if (IS_SET(ch->pcdata->cot_min[level], POW_THANATOSIS))
send_to_char(" Thanatosis",ch);
if (IS_SET(ch->pcdata->cot_min[level], POW_THAUMATURGY))
send_to_char(" Thaumaturgy",ch);
if (IS_SET(ch->pcdata->cot_min[level], POW_VICISSITUDE))
send_to_char(" Vicissitude",ch);
if ((IS_MORE(ch, MORE_LEADER) && !IS_MORE(ch, MORE_CHAMPION)) ||
ch->pcdata->cot_min[level] > POW_NONE)
send_to_char(".\n\r",ch);
}
if ((IS_MORE(ch, MORE_LEADER) && !IS_MORE(ch, MORE_CHAMPION)) ||
ch->pcdata->cot_min[COT_HP] > 0 )
{
sprintf(buf, "Minimum number of hit points required: %d.\n\r",
ch->pcdata->cot_min[COT_HP]);
send_to_char(buf,ch);
}
if ((IS_MORE(ch, MORE_LEADER) && !IS_MORE(ch, MORE_CHAMPION)) ||
ch->pcdata->cot_min[COT_GENERATION] < 13 )
{
sprintf(buf, "Highest generation permitted: %d.\n\r",
ch->pcdata->cot_min[COT_GENERATION]);
send_to_char(buf,ch);
}
if ((IS_MORE(ch, MORE_LEADER) && !IS_MORE(ch, MORE_CHAMPION)) ||
ch->pcdata->cot_min[COT_SKILL] > 0 )
{
sprintf(buf, "Minimum weapon skill required: %d.\n\r",
ch->pcdata->cot_min[COT_SKILL]);
send_to_char(buf,ch);
}
if (IS_SET(ch->pcdata->cot_min[COT_EXTRA], COT_ADV_STANCE))
{
if ((IS_MORE(ch, MORE_LEADER) && !IS_MORE(ch, MORE_CHAMPION)) ||
ch->pcdata->cot_min[COT_STANCE] > 0 )
{
sprintf(buf, "Minimum advanced stance level required: %d.\n\r",
ch->pcdata->cot_min[COT_STANCE]);
send_to_char(buf,ch);
}
else send_to_char("You must have an advanced stance to join.\n\r",ch);
}
else if ((IS_MORE(ch, MORE_LEADER) && !IS_MORE(ch, MORE_CHAMPION)) ||
ch->pcdata->cot_min[COT_STANCE] > 0 )
{
sprintf(buf, "Minimum stance level required: %d.\n\r",
ch->pcdata->cot_min[COT_STANCE]);
send_to_char(buf,ch);
}
if (IS_SET(ch->pcdata->cot_min[COT_EXTRA], COT_GOLCONDA))
send_to_char("You must have (and keep) Golconda.\n\r",ch);
if (IS_SET(ch->pcdata->cot_min[COT_EXTRA], COT_NO_DIABLERIE))
send_to_char("You must never commit diablerie.\n\r",ch);
if (IS_SET(ch->pcdata->cot_min[COT_EXTRA], COT_NO_KILL_SECT))
send_to_char("You must never decapitate someone of your sect.\n\r",ch);
if (IS_SET(ch->pcdata->cot_min[COT_EXTRA], COT_NO_KILL_COTERIE))
send_to_char("You must never decapitate someone within the coterie.\n\r",ch);
send_to_char("--------------------------------------------------------------------------------\n\r",ch);
return;
}
void do_reina( CHAR_DATA *ch, char *argument )
{
char buf [MAX_INPUT_LENGTH];
CHAR_DATA *rch;
if (IS_NPC(ch)) return;
if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch))
{
send_to_char( "Huh?\n\r", ch );
return;
}
if (get_disc(ch,DISC_MELPOMINEE) < 2)
{
send_to_char("You require level 2 Melpominee to sing the Song of Reina.\n\r",ch);
return;
}
if (ch->in_room == NULL)
{
send_to_char("Nothing happens.\n\r",ch);
return;
}
if (IS_MORE(ch, MORE_NEUTRAL))
{
send_to_char("Nothing happens.\n\r",ch);
return;
}
if (IS_MORE(ch, MORE_REINA))
{
REMOVE_BIT(ch->more, MORE_REINA);
REMOVE_BIT(ch->in_room->room_flags, ROOM_SAFE);
send_to_char("The peaceful harmony in the air gradually fades away to nothing.\n\r", ch);
act("A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM );
act("The peaceful harmony in the air gradually fades away to nothing.",ch,NULL,NULL,TO_ROOM);
ch->pcdata->reina = 60;
return;
}
if (IS_SET(ch->in_room->room_flags, ROOM_SAFE))
{
send_to_char("You are unable to sing the Song of Reina here.\n\r", ch);
return;
}
if (ch->pcdata->reina > 0)
{
if (ch->pcdata->reina > 1)
sprintf(buf,"Your voice will not recover for another %d seconds.\n\r",ch->pcdata->reina);
else
sprintf(buf,"Your voice will not recover for another 1 second.\n\r");
send_to_char(buf,ch);
return;
}
SET_BIT(ch->in_room->room_flags, ROOM_SAFE);
SET_BIT(ch->more, MORE_REINA);
ch->pcdata->reina = 60;
send_to_char("You sing the Song of Reina.\n\r", ch);
act("$n sings a beautiful, haunting song.", ch, NULL, NULL, TO_ROOM );
send_to_char("The air is filled with peaceful harmony.\n\r", ch);
act("The air is filled with peaceful harmony.",ch,NULL,NULL,TO_ROOM);
for ( rch = ch->in_room->people; rch != NULL; rch = rch->next_in_room )
{
if ( rch->fighting != NULL )
stop_fighting( rch, TRUE );
}
return;
}
void do_jail( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
char arg [MAX_INPUT_LENGTH];
int sn;
int level;
int spelltype;
argument = one_argument( argument, arg );
if (IS_NPC(ch)) return;
if (!IS_DEMON(ch))
{
send_to_char("Huh?\n\r",ch);
return;
}
if (IS_ITEMAFF(ch, ITEMA_PEACE)) do_majesty(ch,"");
if (arg[0] == '\0' && ch->fighting == NULL)
{
send_to_char("Who do you wish to use Jail of Water on?\n\r",ch);
return;
}
if ( ( victim = ch->fighting ) == NULL )
{
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
}
if ( ch == victim )
{
if (is_affected(ch, gsn_jail))
{
act("The band of water entrapping $n splash to the ground.",ch,NULL,NULL,TO_ROOM);
send_to_char("The bands of water entrapping you splash to the ground.\n\r",ch);
affect_strip(ch, gsn_jail);
}
else if (IS_AFFECTED(ch, AFF_JAIL))
{
act("The band of water entrapping $n splash to the ground.",ch,NULL,NULL,TO_ROOM);
send_to_char("The bands of water entrapping you splash to the ground.\n\r",ch);
REMOVE_BIT(ch->affected_by, AFF_JAIL);
}
else send_to_char( "Nothing happens.\n\r", ch );
return;
}
if ( IS_AFFECTED(victim, AFF_ETHEREAL) )
{
send_to_char( "You cannot use Jail of Water on an ethereal person.\n\r", ch );
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to use Jail of Water on you.",ch,NULL,victim,TO_VICT);
}
return;
}
if (is_safe(ch,victim))
{
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to use Jail of Water on you.",ch,NULL,victim,TO_VICT);
}
return;
}
if ( ( sn = skill_lookup( "jail" ) ) < 0 ) return;
spelltype = skill_table[sn].target;
level = number_range(10,50);
(*skill_table[sn].spell_fun) ( sn, level, ch, victim );
WAIT_STATE( ch, 24 );
return;
}
void do_flames( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
int dam, hp, sn;
char arg[MAX_INPUT_LENGTH];
one_argument( argument, arg );
if (IS_NPC(ch)) return;
if (!IS_VAMPIRE(ch))
{
send_to_char("Huh?\n\r",ch);
return;
}
if (get_disc(ch,DISC_DAIMOINON) < 7)
{
send_to_char("You require level 7 Daimoinon to use Flames of the Nether World.\n\r",ch);
return;
}
if (IS_ITEMAFF(ch, ITEMA_PEACE)) do_majesty(ch,"");
if (arg[0] == '\0' && ch->fighting == NULL)
{
send_to_char( "Who do you wish to strike with the Flames of the Nether World?\n\r", ch );
return;
}
if ( ( victim = ch->fighting ) == NULL )
{
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
}
if ( is_safe(ch, victim) )
{
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to use Flames of the Nether World on you.",ch,NULL,victim,TO_VICT);
}
return;
}
if ( ch == victim )
{
send_to_char( "Now that would be just plain stupid.\n\r", ch );
return;
}
if ( ( sn = skill_lookup( "flame bolt" ) ) < 0 )
{
send_to_char( "Bug - please inform KaVir.\n\r", ch );
return;
}
act( "A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM );
if (IS_ITEMAFF(victim, ITEMA_FIRESHIELD))
{
send_to_char("Nothing happens.\n\r",ch);
WAIT_STATE(ch, 6);
return;
}
if (!IS_NPC(victim) && victim->pcdata->atm >= number_percent())
{
send_to_char("Nothing happens.\n\r",ch);
WAIT_STATE(ch, 6);
return;
}
dam = number_range(50,100) * get_disc(ch,DISC_DAIMOINON);
hp = victim->hit;
if (!IS_NPC(victim) && IS_VAMPIRE(victim) )
damage( ch, victim, (dam*2), sn );
else
damage( ch, victim, dam, sn );
WAIT_STATE(ch, 6);
if (victim == NULL || victim->position == POS_DEAD) return;
else if (!IS_MORE(victim, MORE_FLAMES))
{
send_to_char("You are engulfed in infernal flames!\n\r",victim);
act("$n is engulfed in infernal flames!",victim,NULL,NULL,TO_ROOM);
SET_BIT(victim->affected_by, AFF_FLAMING);
SET_BIT(victim->more, MORE_FLAMES);
}
update_pos(victim);
return;
}
void do_courage( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
char arg [MAX_INPUT_LENGTH];
char buf [MAX_STRING_LENGTH];
argument = one_argument( argument, arg );
if (IS_NPC(ch)) return;
if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch))
{
send_to_char( "Huh?\n\r", ch );
return;
}
if (get_disc(ch,DISC_MELPOMINEE) < 3)
{
send_to_char("You require level 3 Melpominee to sing the Song of Courage.\n\r",ch);
return;
}
if (ch->pcdata->reina > 0)
{
if (ch->pcdata->reina > 1)
sprintf(buf,"Your voice will not recover for another %d seconds.\n\r",ch->pcdata->reina);
else
sprintf(buf,"Your voice will not recover for another 1 second.\n\r");
send_to_char(buf,ch);
return;
}
if ( arg[0] == '\0' )
{
send_to_char( "Who do you wish to use Courage on?\n\r", ch );
return;
}
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "They are not here.\n\r", ch );
return;
}
if (IS_NPC(victim))
{
send_to_char( "Not on NPC's.\n\r", ch );
return;
}
send_to_char("You sing the Song of Courage.\n\r", ch);
act("$n sings a beautiful, haunting song.", ch, NULL, NULL, TO_ROOM );
ch->pcdata->reina = 60;
if (IS_MORE(victim, MORE_COURAGE))
{
if (!IS_NPC(victim) && victim->pcdata->resist[WILL_PRESENCE] > 0 && ch != victim)
{
send_to_char("They resist you.\n\r",ch);
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to remove Courage from you.",ch,NULL,victim,TO_VICT);
}
return;
}
if (!IS_NPC(victim) && IS_WILLPOWER(victim, RES_PRESENCE) &&
victim->pcdata->willpower[0] >= 10 && ch != victim)
{
victim->pcdata->willpower[0] -= 10;
victim->pcdata->resist[WILL_PRESENCE] = 60;
if (!IS_WILLPOWER(victim, RES_TOGGLE))
REMOVE_BIT(victim->pcdata->resist[0], RES_PRESENCE);
send_to_char("You burn some willpower to resist Anger.\n\r",victim);
send_to_char("They resist you.\n\r",ch);
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to remove Courage from you.",ch,NULL,victim,TO_VICT);
}
return;
}
if (ch != victim) send_to_char("You remove their Courage.\n\r",ch);
send_to_char("You no longer feel quite so brave.\n\r",victim);
WAIT_STATE( ch, 12 );
return;
}
if (ch != victim) send_to_char("You grant them great Courage.\n\r",ch);
send_to_char("You suddenly feel very brave.\n\r",victim);
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just used Courage on you.",ch,NULL,victim,TO_VICT);
}
SET_BIT(ch->more, MORE_COURAGE);
WAIT_STATE( ch, 12 );
return;
}
void do_anger( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
char arg [MAX_INPUT_LENGTH];
char buf [MAX_STRING_LENGTH];
argument = one_argument( argument, arg );
if (IS_NPC(ch)) return;
if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch))
{
send_to_char( "Huh?\n\r", ch );
return;
}
if (get_disc(ch,DISC_MELPOMINEE) < 5)
{
send_to_char("You require level 5 Melpominee to sing the Song of Anger.\n\r",ch);
return;
}
if (ch->pcdata->reina > 0)
{
if (ch->pcdata->reina > 1)
sprintf(buf,"Your voice will not recover for another %d seconds.\n\r",ch->pcdata->reina);
else
sprintf(buf,"Your voice will not recover for another 1 second.\n\r");
send_to_char(buf,ch);
return;
}
if ( arg[0] == '\0' )
{
send_to_char( "Who do you wish to use the Song of Anger on?\n\r", ch );
return;
}
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "They are not here.\n\r", ch );
return;
}
if (IS_NPC(victim))
{
send_to_char( "Not on NPC's.\n\r", ch );
return;
}
send_to_char("You sing the Song of Anger.\n\r", ch);
act("$n sings a beautiful, haunting song.", ch, NULL, NULL, TO_ROOM );
ch->pcdata->reina = 60;
if (IS_MORE(victim, MORE_ANGER))
{
send_to_char("You no longer feel so angry.\n\r",victim);
act("$n regains $s temper.",victim,NULL,NULL,TO_ROOM);
REMOVE_BIT(victim->more, MORE_ANGER);
WAIT_STATE( ch, 12 );
return;
}
if (!IS_NPC(victim) && victim->pcdata->resist[WILL_PRESENCE] > 0 && ch != victim)
{
send_to_char("They resist you.\n\r",ch);
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to use Anger on you.",ch,NULL,victim,TO_VICT);
}
return;
}
if (!IS_NPC(victim) && IS_WILLPOWER(victim, RES_PRESENCE) &&
victim->pcdata->willpower[0] >= 10 && ch != victim)
{
victim->pcdata->willpower[0] -= 10;
victim->pcdata->resist[WILL_PRESENCE] = 60;
if (!IS_WILLPOWER(victim, RES_TOGGLE))
REMOVE_BIT(victim->pcdata->resist[0], RES_PRESENCE);
send_to_char("You burn some willpower to resist Anger.\n\r",victim);
send_to_char("They resist you.\n\r",ch);
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to use Anger on you.",ch,NULL,victim,TO_VICT);
}
return;
}
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just used Anger on you.",ch,NULL,victim,TO_VICT);
}
if (IS_MORE(victim, MORE_CALM))
{
send_to_char("You no longer feel so calm.\n\r",victim);
act("$n no longer seems quite so calm.",victim,NULL,NULL,TO_ROOM);
REMOVE_BIT(victim->more, MORE_CALM);
WAIT_STATE( ch, 12 );
return;
}
send_to_char("You suddenly feel very angry!\n\r",victim);
act("$n snarls with anger.",victim,NULL,NULL,TO_ROOM);
SET_BIT(victim->more, MORE_ANGER);
WAIT_STATE( ch, 12 );
return;
}
void do_panacea( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
char arg [MAX_INPUT_LENGTH];
char buf [MAX_STRING_LENGTH];
argument = one_argument( argument, arg );
if (IS_NPC(ch)) return;
if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch) && !IS_ANGEL(ch))
{
send_to_char( "Huh?\n\r", ch );
return;
}
if (get_disc(ch,DISC_OBEAH) < 1)
{
send_to_char("You require level 1 Obeah to use Panacea.\n\r",ch);
return;
}
if (ch->pcdata->obeah > 0)
{
if (ch->pcdata->obeah > 1)
sprintf(buf,"You cannot call upon your Obeah powers for another %d seconds.\n\r",ch->pcdata->obeah);
else
sprintf(buf,"You cannot call upon your Obeah powers for another 1 second.\n\r");
send_to_char(buf,ch);
return;
}
if ( arg[0] == '\0' )
{
send_to_char( "Who do you want to heal with Panacea?\n\r", ch );
return;
}
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "They are not here.\n\r", ch );
return;
}
if (IS_EVIL(victim))
{
send_to_char( "They are too evil to benefit from the powers of Obeah.\n\r", ch );
return;
}
if (!IS_MORE(ch, MORE_OBEAH)) do_obeah(ch,"");
if (victim->loc_hp[6] > 0)
{
int sn = skill_lookup( "clot" );
act( "$n's third eye begins to glow with an intense white light.", ch, NULL, NULL, TO_ROOM );
send_to_char( "Your third eye begins to glow with an intense white light.\n\r", ch );
ch->pcdata->obeah = 5;
(*skill_table[sn].spell_fun) (sn,ch->level,ch,victim);
}
else
{
if ((victim->loc_hp[0] + victim->loc_hp[1] + victim->loc_hp[2] +
victim->loc_hp[3] + victim->loc_hp[4] + victim->loc_hp[5]) != 0)
{
act( "$n's third eye begins to glow with an intense white light.", ch, NULL, NULL, TO_ROOM );
send_to_char( "Your third eye begins to glow with an intense white light.\n\r", ch );
ch->pcdata->obeah = 10;
reg_mend(victim);
}
else if (victim->hit < victim->max_hit)
{
victim->hit += get_disc(ch, DISC_OBEAH) * 1000;
victim->agg -= get_disc(ch, DISC_OBEAH);
if (victim->agg < 0) victim->agg = 0;
act( "$n's third eye begins to glow with an intense white light.", ch, NULL, NULL, TO_ROOM );
send_to_char( "Your third eye begins to glow with an intense white light.\n\r", ch );
ch->pcdata->obeah = 30;
update_pos(victim);
if (victim->hit >= victim->max_hit)
{
victim->hit = victim->max_hit;
send_to_char("You have been completely healed!\n\r",victim);
act("$n's wounds have been completely healed!",victim,NULL,NULL,TO_ROOM);
}
else
{
send_to_char("Your wounds begin to heal!\n\r",victim);
act("$n's wounds begin to heal!",victim,NULL,NULL,TO_ROOM);
}
}
else
{
send_to_char("They don't require any healing.\n\r",ch);
return;
}
}
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just used Panacea on you.",ch,NULL,victim,TO_VICT);
}
return;
}
void do_anesthetic( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
char arg [MAX_INPUT_LENGTH];
char buf [MAX_STRING_LENGTH];
argument = one_argument( argument, arg );
if (IS_NPC(ch)) return;
if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch) && !IS_ANGEL(ch))
{
send_to_char( "Huh?\n\r", ch );
return;
}
if (get_disc(ch,DISC_OBEAH) < 2)
{
send_to_char("You require level 2 Obeah to use Anesthetic Touch.\n\r",ch);
return;
}
if (ch->pcdata->obeah > 0)
{
if (ch->pcdata->obeah > 1)
sprintf(buf,"You cannot call upon your Obeah powers for another %d seconds.\n\r",ch->pcdata->obeah);
else
sprintf(buf,"You cannot call upon your Obeah powers for another 1 second.\n\r");
send_to_char(buf,ch);
return;
}
if ( arg[0] == '\0' )
{
send_to_char( "Who do you want to use Anesthetic Touch on?\n\r", ch );
return;
}
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "They are not here.\n\r", ch );
return;
}
if (IS_EVIL(victim))
{
send_to_char( "They are too evil to benefit from the powers of Obeah.\n\r", ch );
return;
}
if (!IS_MORE(ch, MORE_OBEAH)) do_obeah(ch,"");
act( "$n's third eye begins to glow with an intense white light.", ch, NULL, NULL, TO_ROOM );
send_to_char( "Your third eye begins to glow with an intense white light.\n\r", ch );
ch->pcdata->obeah = 30;
if (IS_MORE(victim, MORE_CALM))
{
send_to_char("You remove their immunity to pain.\n\r",ch);
send_to_char("You no longer feel so oblivious to pain.\n\r",victim);
REMOVE_BIT(victim->more, MORE_NOPAIN);
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just removed Anesthetic Touch from you.",ch,NULL,victim,TO_VICT);
}
return;
}
send_to_char("You make them immune to pain.\n\r",ch);
send_to_char("You feel completely oblivious to pain.\n\r",victim);
SET_BIT(victim->more, MORE_NOPAIN);
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just used Anesthetic Touch on you.",ch,NULL,victim,TO_VICT);
}
return;
}
void do_neutral( CHAR_DATA *ch, char *argument )
{
char buf [MAX_INPUT_LENGTH];
CHAR_DATA *rch;
if (IS_NPC(ch)) return;
if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch) && !IS_ANGEL(ch))
{
send_to_char( "Huh?\n\r", ch );
return;
}
if (get_disc(ch,DISC_OBEAH) < 3)
{
send_to_char("You require level 3 Obeah to create a Neutral Guard.\n\r",ch);
return;
}
if (ch->pcdata->obeah > 0 && !IS_MORE(ch, MORE_NEUTRAL))
{
if (ch->pcdata->obeah > 1)
sprintf(buf,"You cannot call upon your Obeah powers for another %d seconds.\n\r",ch->pcdata->obeah);
else
sprintf(buf,"You cannot call upon your Obeah powers for another 1 second.\n\r");
send_to_char(buf,ch);
return;
}
if (ch->in_room == NULL)
{
send_to_char("Nothing happens.\n\r",ch);
return;
}
if (IS_MORE(ch, MORE_REINA))
{
send_to_char("Nothing happens.\n\r",ch);
return;
}
if (IS_MORE(ch, MORE_NEUTRAL))
{
REMOVE_BIT(ch->more, MORE_NEUTRAL);
REMOVE_BIT(ch->in_room->room_flags, ROOM_SAFE);
act("A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM );
send_to_char("The peaceful harmony in the air gradually fades away to nothing.\n\r", ch);
act("The peaceful harmony in the air gradually fades away to nothing.",ch,NULL,NULL,TO_ROOM);
ch->pcdata->obeah = 30;
return;
}
if (IS_SET(ch->in_room->room_flags, ROOM_SAFE))
{
send_to_char("You are unable to create a Neutral Guard here.\n\r", ch);
return;
}
SET_BIT(ch->in_room->room_flags, ROOM_SAFE);
SET_BIT(ch->more, MORE_NEUTRAL);
act( "$n's third eye begins to glow with an intense white light.", ch, NULL, NULL, TO_ROOM );
send_to_char( "Your third eye begins to glow with an intense white light.\n\r", ch );
ch->pcdata->obeah = 30;
send_to_char("The air is filled with peaceful harmony.\n\r", ch);
act("The air is filled with peaceful harmony.",ch,NULL,NULL,TO_ROOM);
for ( rch = ch->in_room->people; rch != NULL; rch = rch->next_in_room )
{
if ( rch->fighting != NULL )
stop_fighting( rch, TRUE );
}
return;
}
void do_unburden( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
char arg [MAX_INPUT_LENGTH];
char buf [MAX_STRING_LENGTH];
argument = one_argument( argument, arg );
if (IS_NPC(ch)) return;
if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch) && !IS_ANGEL(ch))
{
send_to_char( "Huh?\n\r", ch );
return;
}
if (get_disc(ch,DISC_OBEAH) < 4)
{
send_to_char("You require level 4 Obeah to Unburden the Bestial Soul.\n\r",ch);
return;
}
if (ch->pcdata->obeah > 0)
{
if (ch->pcdata->obeah > 1)
sprintf(buf,"You cannot call upon your Obeah powers for another %d seconds.\n\r",ch->pcdata->obeah);
else
sprintf(buf,"You cannot call upon your Obeah powers for another 1 second.\n\r");
send_to_char(buf,ch);
return;
}
if ( arg[0] == '\0' )
{
send_to_char( "Who's Soul do you wish to Unburden?\n\r", ch );
return;
}
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "They are not here.\n\r", ch );
return;
}
if (ch == victim)
{
send_to_char( "You may not do this too yourself.\n\r", ch );
return;
}
if (!IS_VAMPIRE(victim) || IS_ABOMINATION(victim) || IS_LICH(victim))
{
send_to_char( "You can only Unburden the Soul of a Kindred.\n\r", ch );
return;
}
if (!IS_IMMUNE(victim,IMM_VAMPIRE))
{
send_to_char( "They must lower their defences before you can try to Unburden their Soul.\n\r", ch );
return;
}
if (victim->position > POS_RESTING)
{
send_to_char( "You better get them to sit down first.\n\r", ch );
return;
}
if (victim->beast == 100)
{
send_to_char( "Their Soul is too Bestial to Unburden.\n\r", ch );
return;
}
if (IS_EVIL(victim))
{
send_to_char( "They are too evil to benefit from the powers of Obeah.\n\r", ch );
return;
}
if (!IS_MORE(ch, MORE_OBEAH)) do_obeah(ch,"");
act( "You place your hands against $N's chest.", ch, NULL, victim, TO_CHAR );
act( "$n places $s hands against your chest.", ch, NULL, victim, TO_VICT );
act( "$n places $s hands against $N's chest.", ch, NULL, victim, TO_NOTVICT );
if (victim->beast > victim->truebeast && victim->beast > 1)
{
act( "$n's third eye begins to glow with an intense white light.", ch, NULL, NULL, TO_ROOM );
send_to_char( "Your third eye begins to glow with an intense white light.\n\r", ch );
victim->beast -= get_disc(ch, DISC_OBEAH);
if ( victim->beast < 1 ) victim->beast = 1;
ch->pcdata->obeah = 30;
if (victim->beast < victim->truebeast) victim->beast = victim->truebeast;
send_to_char("You feel their beast weaken it's grip!\n\r",ch);
send_to_char("You feel your beast weaken it's grip!\n\r",victim);
}
else
{
send_to_char("You are unable to help them any further.\n\r",ch);
return;
}
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just used Unburden the Bestial Soul on you.",ch,NULL,victim,TO_VICT);
}
send_to_char("Your hands drop to your sides.\n\r",ch);
act( "$n's hands drop to $s sides.", ch, NULL, NULL, TO_ROOM );
return;
}
void do_renew( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
char arg [MAX_INPUT_LENGTH];
char buf [MAX_STRING_LENGTH];
int sn, check, oldcheck;
argument = one_argument( argument, arg );
if (IS_NPC(ch)) return;
if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch) && !IS_ANGEL(ch))
{
send_to_char( "Huh?\n\r", ch );
return;
}
if (get_disc(ch,DISC_OBEAH) < 5)
{
send_to_char("You require level 5 Obeah to use Renewed Vigor.\n\r",ch);
return;
}
if (ch->position == POS_FIGHTING)
{
send_to_char("No way! You are still fighting!\n\r",ch);
return;
}
if (ch->pcdata->obeah > 0)
{
if (ch->pcdata->obeah > 1)
sprintf(buf,"You cannot call upon your Obeah powers for another %d seconds.\n\r",ch->pcdata->obeah);
else
sprintf(buf,"You cannot call upon your Obeah powers for another 1 second.\n\r");
send_to_char(buf,ch);
return;
}
if ( arg[0] == '\0' )
{
send_to_char( "Who do you want to use Renewed Vigor on?\n\r", ch );
return;
}
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "They are not here.\n\r", ch );
return;
}
if (IS_EVIL(victim))
{
send_to_char( "They are too evil to benefit from the powers of Obeah.\n\r", ch );
return;
}
if (!IS_MORE(ch, MORE_OBEAH)) do_obeah(ch,"");
if ((victim->loc_hp[0] + victim->loc_hp[1] + victim->loc_hp[2] +
victim->loc_hp[3] + victim->loc_hp[4] + victim->loc_hp[5] +
victim->loc_hp[6]) == 0 && victim->hit == victim->max_hit)
{
send_to_char("They don't require any healing.\n\r",ch);
return;
}
act( "$n's third eye begins to glow with an intense white light.", ch, NULL, NULL, TO_ROOM );
send_to_char( "Your third eye begins to glow with an intense white light.\n\r", ch );
ch->pcdata->obeah = 60;
if ( (check = victim->loc_hp[6]) > 0)
{
oldcheck = 0;
sn = skill_lookup( "clot" );
while ( oldcheck != (check = victim->loc_hp[6]) )
{
oldcheck = check;
(*skill_table[sn].spell_fun) (sn,ch->level,ch,victim);
}
}
if ((check = (victim->loc_hp[0] + victim->loc_hp[1] + victim->loc_hp[2] +
victim->loc_hp[3] + victim->loc_hp[4] + victim->loc_hp[5])) > 0)
{
oldcheck = 0;
while ( oldcheck != (check = victim->loc_hp[0] + victim->loc_hp[1] +
victim->loc_hp[2] + victim->loc_hp[3] + victim->loc_hp[4] +
victim->loc_hp[5]) )
{
oldcheck = check;
reg_mend(victim);
}
}
if (victim->hit < victim->max_hit)
{
victim->hit = victim->max_hit;
victim->agg = 0;
send_to_char("You have been completely healed!\n\r",victim);
act("$n's wounds have been completely healed!",victim,NULL,NULL,TO_ROOM);
update_pos(victim);
}
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just used Renewed Vigor on you.",ch,NULL,victim,TO_VICT);
}
return;
}
void do_lick( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "You lick your lips and smile.\n\r", ch );
act("$n licks $s lips and smiles.",ch,NULL,NULL,TO_ROOM);
return;
}
else if ( ( victim = get_char_room( ch, arg ) ) != NULL )
{
if ( victim == ch )
{
send_to_char( "You lick yourself.\n\r", ch );
act("$n licks $mself - YUCK.",ch,NULL,NULL,TO_ROOM);
}
else
{
act("You lick $M.",ch,NULL,victim,TO_CHAR);
act("$n licks you.",ch,NULL,victim,TO_VICT);
act("$n licks $N.",ch,NULL,victim,TO_NOTVICT);
}
return;
}
else
{
if (IS_VAMPIRE(ch))
{
if (!str_cmp(arg,"l") || !str_cmp(arg,"left"))
{
if (!IS_ARM_L(ch, SLIT_WRIST))
{
send_to_char("Your left wrist doesn't need licking shut.\n\r",ch);
return;
}
act("You lick shut the cut in your left wrist.",ch,NULL,NULL,TO_CHAR);
act("$n licks shut the cut in $s left wrist.",ch,NULL,NULL,TO_ROOM);
REMOVE_BIT(ch->loc_hp[6], BLEEDING_WRIST_L);
REMOVE_BIT(ch->loc_hp[LOC_ARM_L], SLIT_WRIST);
return;
}
else if (!str_cmp(arg,"r") || !str_cmp(arg,"right"))
{
if (!IS_ARM_R(ch, SLIT_WRIST))
{
send_to_char("Your right wrist doesn't need licking shut.\n\r",ch);
return;
}
act("You lick shut the cut in your right wrist.",ch,NULL,NULL,TO_CHAR);
act("$n licks shut the cut in $s right wrist.",ch,NULL,NULL,TO_ROOM);
REMOVE_BIT(ch->loc_hp[6], BLEEDING_WRIST_R);
REMOVE_BIT(ch->loc_hp[LOC_ARM_R], SLIT_WRIST);
return;
}
}
send_to_char( "They aren't here.\n\r", ch );
return;
}
return;
}
void do_breath( CHAR_DATA *ch, char *argument )
{
char arg [MAX_INPUT_LENGTH];
CHAR_DATA *victim;
OBJ_DATA *obj_lose;
OBJ_DATA *obj_next;
int dam, sn;
one_argument( argument, arg );
if (IS_NPC(ch)) return;
if ( ( sn = skill_lookup( "gas breath" ) ) < 0 )
{
send_to_char( "Bug...please inform KaVir.\n\r", ch );
return;
}
if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch))
{
send_to_char( "Huh?\n\r", ch );
return;
}
if (get_disc(ch,DISC_SERPENTIS) < 5)
{
send_to_char("You require level 5 Serpentis to use Breath of the Basilisk.\n\r",ch);
return;
}
if (IS_ITEMAFF(ch, ITEMA_PEACE)) do_majesty(ch,"");
if (arg[0] == '\0' && ch->fighting == NULL)
{
send_to_char("Who do you wish to use Breath of the Basilisk on?\n\r",ch);
return;
}
if ( ( victim = ch->fighting ) == NULL )
{
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
}
if (is_safe(ch,victim))
{
if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN))
{
guardian_message( victim );
act("$n just failed to use Breath of the Basilisk on you.",ch,NULL,victim,TO_VICT);
}
return;
}
dam = number_range(500,1000) * get_disc(ch, DISC_SERPENTIS) * get_disc(ch, DISC_SERPENTIS);
if ( !IS_AWAKE(victim) )
dam *= 2;
damage( ch, victim, dam, sn + TYPE_ADD_AGG );
WAIT_STATE( ch, 6 );
if ( number_percent( ) < (get_disc(ch,DISC_SERPENTIS) << 2) )
{
for (obj_lose = victim->carrying; obj_lose != NULL; obj_lose = obj_next)
{
obj_next = obj_lose->next_content;
if ( number_bits( 2 ) != 0 )
continue;
switch ( obj_lose->item_type )
{
case ITEM_ARMOR:
if ( obj_lose->condition > 0 )
{
act( "$p is pitted and etched!",
victim, obj_lose, NULL, TO_CHAR );
obj_lose->condition -= 25;
if ( obj_lose->condition < 1 )
extract_obj( obj_lose );
}
break;
case ITEM_SCROLL:
case ITEM_WAND:
case ITEM_STAFF:
case ITEM_TRASH:
case ITEM_POTION:
case ITEM_FURNITURE:
case ITEM_FOOD:
case ITEM_BOAT:
case ITEM_PILL:
case ITEM_CORPSE_NPC:
case ITEM_DRINK_CON:
case ITEM_CONTAINER:
act( "$p fumes and dissolves!",
victim, obj_lose, NULL, TO_CHAR );
extract_obj( obj_lose );
break;
}
}
}
return;
}
void do_celerity( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
argument = one_argument( argument, arg );
if ( (IS_NPC(ch) || (!IS_VAMPIRE(ch) && !IS_GHOUL(ch)))
&& get_disc(ch, DISC_CELERITY) < 1 )
{
send_to_char("Huh?\n\r",ch);
return;
}
if (get_disc(ch, DISC_CELERITY) < 1)
{
send_to_char("But you don't have any Celerity!\n\r",ch);
return;
}
if (arg[0] != '\0')
{
if (!str_cmp(arg,"renew"))
{
if (IS_WILLPOWER(ch, RES_CELERITY))
{
send_to_char("You will no longer automatically renew Celerity when you are in a fight.\n\r",ch);
REMOVE_BIT(ch->pcdata->resist[0], RES_CELERITY);
}
else
{
send_to_char("You will now automatically renew Celerity when you are in a fight.\n\r",ch);
SET_BIT(ch->pcdata->resist[0], RES_CELERITY);
}
}
else
send_to_char("Type 'celerity' to activate, or 'celerity renew' to toggle autorenew.\n\r",ch);
return;
}
else
{
if ( ch->blood[BLOOD_CURRENT] < 10 )
{
send_to_char("You have insufficient blood.\n\r",ch);
return;
}
if ( ch->pcdata->celerity > 60 )
{
send_to_char("You are unable to burn any more blood for celerity.\n\r",ch);
return;
}
else
{
if ( ch->pcdata->celerity > 0 )
send_to_char("You burn some more blood to keep your celerity running longer.\n\r",ch);
else
{
send_to_char("You start moving with supernatural speed!\n\r",ch);
act("$n starts moving with supernatural speed!",ch,NULL,NULL,TO_ROOM);
}
ch->pcdata->celerity += 60;
ch->blood[BLOOD_CURRENT] -= 10;
return;
}
}
return;
}
void guardian_message( CHAR_DATA *ch )
{
if ( IS_DEMON(ch) )
{
if ( IS_ANGEL(ch) )
{
send_to_char("Your little cherub whispers softly into your ear:\n\r",ch);
act( "A little cherub on $n's shoulder whispers something into $n's ear.",ch,NULL,NULL,TO_ROOM);
}
else
{
send_to_char("Your pet imp whispers softly into your ear:\n\r",ch);
act( "A tiny imp on $n's shoulder whispers something into $n's ear.",ch,NULL,NULL,TO_ROOM);
}
}
else
send_to_char("Your guardian spirit sends you a telepathic message:\n\r",ch);
return;
}