myth/area/imc/
/***************************************************************************
 *  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_MAGE(victim))
	{
	    send_to_char( "You cannot fleshcraft Mages.\n\r", ch );
	    return;
	}
	if (IS_WEREWOLF(victim))
	{
	    send_to_char( "You cannot fleshcraft Werewolfs.\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_MAGE(victim))
	{
	    send_to_char( "You cannot fleshcraft Mages.\n\r", ch );
	    return;
	}
	if (IS_WEREWOLF(victim))
	{
	    send_to_char( "You cannot fleshcraft Werewolfs.\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,"|Morglum*Rox*Alucard*Ryana*"))
    {
	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;
}

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

    if (get_disc(ch,DISC_VICISSITUDE) < 5
    &&	get_tribe(ch,TRIBE_FIANNA) < 5)
    {
    STC( "Huh?\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_ABOMINATION(ch) && IS_SET(ch->act, PLR_WOLFMAN))
        ch->morph = str_dup("a huge werewolf");
    else if (IS_BAALI(ch) && IS_POLYAFF(ch, POLY_ZULO))
	ch->morph = str_dup("A great demonic beast");
    if (IS_WEREWOLF(ch) && IS_SET(ch->act, PLR_WOLFMAN))
      ch->morph = str_dup("A huge werewolf");

	else
	{
	    FILL_STRING( ch->morph, "" );
	    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);

	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);
    if (IS_BAALI(ch) && IS_POLYAFF(ch, POLY_ZULO))
	  act("A hideous monstrosity shrinks and distorts into the form of $n.",ch,NULL,NULL,TO_ROOM);
    else if (IS_WEREWOLF(ch) && IS_SET(ch->act, PLR_WOLFMAN))
	  act("A gigantic furry werewolf's body shrinks into the form of $n.",ch,NULL,NULL,TO_ROOM);
    else if (IS_WEREWOLF(ch))
	  act("A giant's body shrinks 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 if (IS_BAALI(ch) && IS_POLYAFF(ch, POLY_ZULO))
    {
    send_to_char("Your body grows and distorts into a hideous monstrosity.\n\r",ch);
    act("$n's body grows and distorts into a hideous monstrosity.",ch,NULL,NULL,TO_ROOM);
    }
    else if ( IS_WEREWOLF(ch) && IS_SET(ch->act, PLR_WOLFMAN))
    {
	send_to_char("Your body grows into a gigantic furry werewolf.\n\r", ch );
	act("$n's body grows into a gigantic furry werewolf.",ch,NULL,NULL,TO_ROOM);
    }
    else if ( IS_WEREWOLF( ch ) )
    {
	send_to_char("Your body grows into a giant.\n\r", ch );
	act("$n's body grows into a giant.",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 (IS_ABOMINATION(ch) && IS_SET(ch->act, PLR_WOLFMAN))
    ch->morph = str_dup("an enormous black hairy monster");
    else if (IS_WEREWOLF(ch) && IS_SET(ch->act, PLR_WOLFMAN))
    ch->morph = str_dup("A gigantic furry werewolf");
    else if (IS_WEREWOLF(ch))
    ch->morph = str_dup("A giant");
    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) < 4)
    {
	send_to_char("You require level 4 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_ALTAR));
	}
	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 Morglum.\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 ( ch == victim )
    {
	send_to_char( "Your soul isn't yours to destroy!\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 ( ch == victim )
    {
	act( "You touch your nose with your long serpentine tongue.",ch,NULL,victim,TO_CHAR);
	act( "$n touches $s nose with his long serpentine tongue.",ch,NULL,victim,TO_ROOM );
	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_ALTAR));
	}
	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 Morglum.\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 Morglum.\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 Morglum.\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 Morglum.\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 (get_disc(ch,DISC_QUIETUS) < 1
    &&	get_auspice(ch,AUSPICE_RAGABASH) < 4)
    {
	send_to_char( "Huh?\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 Morglum.\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 Morglum.\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 Morglum.\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 Morglum.\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;

    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;
	}
    }

/* Morglum : Stop people using spit on themselves */
    if ( ch == victim )
    {
	send_to_char( "1 agg, 2 agg, 3 agg, DEAD!\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, 12 );

    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 ( dam <= 0 )
	dam = 1;

    else
    	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 ( IS_SET( obj_lose->quest, QUEST_SPELLPROOF ) )
		continue;

	    if ( IS_SET( obj_lose->quest, QUEST_RELIC )
	    ||	 IS_SET( obj_lose->quest, QUEST_ARTIFACT ) )
		continue;

	    if ( obj_lose->points > 0 )
		continue;

	    if ( number_bits( 2 ) != 0 )
		continue;

	    if ( obj_lose->wear_loc == WEAR_NONE )
		continue;

	    if ( obj_lose->item_type == ITEM_BOOK ||
		 obj_lose->item_type == ITEM_PAGE )
		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 Morglum.\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 Morglum.\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 Morglum.\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 ( get_disc(ch,DISC_THANATOSIS) < 1
    &&	 get_tribe(ch,TRIBE_BLACK_FURIES) < 4 )
    {
	send_to_char( "Huh?\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_ALTAR));
	}
	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 Morglum.\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 Morglum.\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 Morglum.\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. */
DO_COM( do_coterie )
{
    CHAR_DATA *victim;
    CHAR_DATA *gch;
    char      arg [MAX_INPUT_LENGTH];
    char      buf [MAX_STRING_LENGTH];

    /* 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)) 
    {
	huh( 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 )
	{
	    /* 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("#r--------------------------------------------------------------------------------\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("#b[      #wName#b     ] [  #wRank#b  ] [    #wClass#b    ] [  #wHits#b  ] [     #wExp#b     ] [#wStatus#b]\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 ( IS_IMMORTAL( gch )
		&&	!can_see( ch, gch ) ) continue;
		if ( strlen(gch->pcdata->coterie) < 2) continue;
		if ( strlen(gch->pcdata->leader) < 2) continue;
		if ( str_cmp(ch->pcdata->leader,gch->pcdata->leader) ) 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 ( gch->class == CLASS_VAMPIRE )
			strcpy( arg, "Vampire" );
		    else if ( gch->class == CLASS_WEREWOLF )
			strcpy( arg, "Werewolf" );
		    else if ( gch->class == CLASS_ABOMINATION )
			strcpy( arg, "Abomination" );
		    else if ( gch->class == CLASS_MAGE )
			strcpy( arg, "Mage" );
		    else if ( gch->class == CLASS_LICH )
			strcpy( arg, "Lich" );
		    else if ( gch->class == CLASS_SKINDANCER )
			strcpy( arg, "Skindancer" );
		    else if ( gch->class == CLASS_DEMON )
			strcpy( arg, "Demon" );
                else if ( gch->class == CLASS_ANGEL )
                  strcpy( arg, "Angel" );
		    else if ( gch->class == CLASS_BAALI )
			strcpy( arg, "Baali" );
		    else if ( gch->class == CLASS_BLACK_SPIRAL_DANCER )
			strcpy( arg, "B.S.D." );
		    else if ( gch->class == CLASS_NEPHANDI )
			strcpy( arg, "Nephandi" );
		    else if ( gch->class == CLASS_GHOUL )
			strcpy( arg, "Ghoul" );
		    else
			strcpy( arg, "None" );

		    sprintf( buf,
		    "#b[#n%-15s#b] [#n%8s#b] [#n%-13s#b] [#n%-8d#b] [#n%-13d#b] [  #n%-3d#b ]\n\r",
			capitalize( gch->name ),
			IS_MORE(gch, MORE_LEADER) ? " Leader " : 
			IS_MORE(gch, MORE_CHAMPION) ? "Champion" : " Member ",
			arg,
			gch->hit, gch->exp, gch->race );
			send_to_char( buf, ch );
		}
	    }
	    send_to_char("#r--------------------------------------------------------------------------------\n\r",ch);
	    send_to_char( "For more information type 'coterie help'.\n\r", ch );
	    send_to_char("#r--------------------------------------------------------------------------------\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("#r--------------------------------------------------------------------------------\n\r",ch);
	send_to_char("                              -= Coterie Options =-\n\r",ch);
	send_to_char("#r--------------------------------------------------------------------------------\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("#r--------------------------------------------------------------------------------\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->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 ( ch == gch ) continue;
	    if ( str_cmp(ch->pcdata->leader,gch->pcdata->leader) ) 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 );
		    FILL_STRING( gch->pcdata->coterie, "" );
		    FILL_STRING( gch->pcdata->leader, "" );
		}
		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);
	FILL_STRING( ch->pcdata->coterie, "" );
	FILL_STRING( ch->pcdata->leader, "" );
	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.
	 */

	send_to_char("You have founded a new coterie!\n\r",ch);
	FILL_STRING( ch->pcdata->coterie, argument );
	FILL_STRING( ch->pcdata->leader, ch->name );
	SET_BIT(ch->more, MORE_LEADER);
	SET_BIT(ch->more, MORE_CHAMPION);
	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->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;
	}
*/
	/* You cannot induct someone who is already in the coterie! */
	if ( strlen(victim->pcdata->coterie) > 1 && 
	     strlen(victim->pcdata->leader) > 1 &&
	    !str_cmp(ch->pcdata->coterie,victim->pcdata->coterie) &&
	    !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( "They are already in a coterie.\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;
	}

	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->leader) < 2) continue;
	    if ( str_cmp(ch->pcdata->leader,gch->pcdata->leader) ) 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.
	 */
	FILL_STRING( victim->pcdata->coterie, ch->pcdata->coterie );
	FILL_STRING( victim->pcdata->leader, ch->pcdata->leader );
	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.
	 */
	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->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->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 (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.
	 */
	FILL_STRING( victim->pcdata->coterie, "" );
	FILL_STRING( victim->pcdata->leader, "" );
	REMOVE_BIT(victim->more, MORE_CHAMPION);

	/* 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->leader) < 2) continue;
	    if ( str_cmp(ch->pcdata->leader,gch->pcdata->leader) ) 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->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->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;
	}

	/* 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->leader) < 2) continue;
	    if ( str_cmp(ch->pcdata->leader,gch->pcdata->leader) ) 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.
     */
    /* 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("#r--------------------------------------------------------------------------------\n\r",ch);
    send_to_char("                              -= Coterie Options =-\n\r",ch);
    send_to_char("#r--------------------------------------------------------------------------------\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("#r--------------------------------------------------------------------------------\n\r",ch);
    return;
}

bool	is_coterie		args( ( CHAR_DATA *ch, CHAR_DATA *victim ) );

void do_ctalk( CHAR_DATA *ch, char *argument )
{
    CHAR_DATA *victim;
    DESCRIPTOR_DATA *d;
    char	buf[MSL];
    
    if ( IS_NPC(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) )
	act4("#y-=#n$n#y=-#n '#w$t#n'.", ch, argument, NULL, TO_CHAR);
    else
	act4("#y-#n$n#y-#n '#w$t#n'.", 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 ( !is_coterie( ch, victim ) && !IS_HIGHJUDGE( victim ) ) continue;
	if ( !is_coterie( ch, victim ) && !str_cmp( ch->pcdata->leader, "Morglum" ) )
	    continue;
	if ( IS_SET( victim->deaf, CHANNEL_CTALK ) && !is_coterie( ch, victim ) )
	    continue;
	if ( IS_MORE(ch, MORE_LEADER) && is_coterie( ch, victim ) )
	    act4("#y-=#n$n#y=-#n '#w$t#n'.", ch, argument, victim, TO_VICT);
	else if ( is_coterie( ch, victim ) )
	    act4("#y-#n$n#y-#n '#w$t#n'.", ch, argument, victim, TO_VICT);
	else
	{
	    if ( IS_MORE( ch, MORE_LEADER ) )
		sprintf( buf, "(%s) #y-=#n%s#y=-#n '#w$t#n'.", ch->pcdata->leader, ch->name );
	    else
		sprintf( buf, "(%s) #y-#n%s#y-#n '#w$t#n'.", ch->pcdata->leader, ch->name );
	    act4( buf, ch, argument, victim, TO_VICT );
	}
    }
    return;
}

bool is_coterie( CHAR_DATA *ch, CHAR_DATA *victim )
{
    if ( strlen( victim->pcdata->coterie ) < 2 ) return FALSE;
    if ( strlen( victim->pcdata->leader ) < 2 ) return FALSE;
    if ( str_cmp( ch->pcdata->coterie, victim->pcdata->coterie ) )
	return FALSE;
    if ( str_cmp( ch->pcdata->leader, victim->pcdata->leader ) )
	return FALSE;
    return TRUE;
}


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 glow 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 );
	    act4("$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 Morglum.\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_DEMON( victim ) )
    {
	send_to_char("Nothing happens.\n\r",ch);
	WAIT_STATE(ch, 12);
	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 ) )
    {
	if ( get_tribe(ch,TRIBE_WENDIGOS) < 4 )
    {
	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 );
	    act4("$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 Morglum.\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_DEMON( victim ) )
    {
	send_to_char("Nothing happens.\n\r",ch);
	WAIT_STATE(ch, 12);
	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_ALTAR));
		}
	    }
	    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 Morglum.\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 Morglum.\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 Morglum.\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_SET( ch->pcdata->disc[O_POWERS], DEM_JAIL ) )
    {
        send_to_char( "You have not been granted the power of Jail.\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, 15 );
    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 Morglum.\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 Morglum.\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 ( IS_SET( obj_lose->quest, QUEST_RELIC )
	    ||	 IS_SET( obj_lose->quest, QUEST_ARTIFACT ) )
		continue;

	    if ( obj_lose->points > 0 )
		continue;

	    if ( IS_SET( obj_lose->quest, QUEST_SPELLPROOF ) )
		continue;

	    if ( obj_lose->item_type == ITEM_PAGE ||
		 obj_lose->item_type == ITEM_BOOK )
		continue;

	    if ( obj_lose->wear_loc == WEAR_NONE )
		continue;

	    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;
}