/**************************************************************
 *  Myth Mud improvements ALL by David Spink aka Morglum.     *
 *  This mud is NOT to be copied in whole or in part! No one  *
 *  has the permission to authorise the use of this code.     *
 *  In order to use this code you MUST comply with the terms  *
 *  and conditions in 'license.myth' (as shipped).            *
 **************************************************************/

#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 <unistd.h>
#include "merc.h"


DO_COM( do_truedisguise )
{
    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_OBFUSCATE) < 3)
    {
	send_to_char("You require level 3 Obfuscate to use True Disguise.\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_EXTRA(ch, EXTRA_VICISSITUDE))
    {
	send_to_char( "You are unable to change your appearance.\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_TRUE))
	{
	    send_to_char("Nothing happens.\n\r",ch);
	    return;
	}
	sprintf(buf,"$n's form shifts into an image of %s.",ch->name);
	act(buf,ch,NULL,NULL,TO_ROOM);
	REMOVE_BIT(ch->affected_by, AFF_POLYMORPH);
	REMOVE_BIT(ch->vampaff, VAM_DISGUISED);
	REMOVE_BIT(ch->polyaff, POLY_TRUE);
    	free_string( ch->morph );
    	ch->morph = str_dup( "" );
	act("Your form shifts into an image of $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_TRUE))
	{
	    send_to_char("Nothing happens.\n\r",ch);
	    return;
	}
	act("Your form shifts into an image of $N.",ch,NULL,victim,TO_CHAR);
	act("$n's form shifts into an image of you.",ch,NULL,victim,TO_VICT);
	act("$n's form shifts into an image of $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 form shifts into an image of $N.",ch,NULL,victim,TO_CHAR);
    act("$n's form shifts into an image of you.",ch,NULL,victim,TO_VICT);
    act("$n's form shifts into an image of $N.",ch,NULL,victim,TO_NOTVICT);
    SET_BIT(ch->affected_by, AFF_POLYMORPH);
    SET_BIT(ch->vampaff, VAM_DISGUISED);
    SET_BIT(ch->polyaff, POLY_TRUE);
    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;
}

DO_COM( do_mindblast )
{
    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_DOMINATE) < 5)
    {
	send_to_char("You require level 5 Dominate 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;
}

DO_COM( do_spiritform )
{
    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) < 5)
    {
	send_to_char("You require level 5 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;
}

DO_COM( do_spiriteyes )
{
    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_LAMIA) < 1)
    {
	send_to_char("You require level 1 Lamia to use Spirit Eyes.\n\r",ch);
	return;
    }

    if (IS_VAMPAFF(ch,VAM_SPIRITEYES) )
    {
	send_to_char("You can no longer sense things in the shadowlands.\n\r",ch);
	REMOVE_BIT(ch->vampaff, VAM_SPIRITEYES);
	return;
    }
    send_to_char("You can now sense things in the shadowlands.\n\r",ch);
    SET_BIT(ch->vampaff, VAM_SPIRITEYES);
    return;
}

DO_COM( do_succulence )
{
    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_LAMIA) < 2)
    {
	send_to_char("You require level 2 Lamia 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;
}

DO_COM( do_omnipotence )
{
    char arg [MAX_INPUT_LENGTH];
    CHAR_DATA *eye;
    CHAR_DATA *victim;

    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_LAMIA) < 3)
    {
	send_to_char("You require level 3 Lamia to use Omnipotence.\n\r",ch);
	return;
    }

    if ( arg[0] == '\0' )
    {
	if ( ( eye = ch->pcdata->familiar ) != NULL &&
	    eye->pIndexData->vnum == MOB_VNUM_EYE)
	{
	    send_to_char( "You are no longer using your Omnipotence.\n\r",ch );
	    ch->pcdata->familiar = NULL;
	    eye->wizard = NULL;
	    extract_char(eye, TRUE);
	    return;
	}
	send_to_char( "Who do you wish to use Omnipotence on?\n\r", ch );
	return;
    }

    if ( ( victim = get_char_world( ch, arg ) ) == NULL )
    {
	send_to_char( "They aren't here.\n\r", ch );
	return;
    }

    if ( ch == victim )
    {
	send_to_char( "Now that would be completely pointless.\n\r", ch );
	return;
    }

    if (IS_IMMORTAL(victim) || IS_IMMUNE(victim,IMM_SHIELDED))
    {
	send_to_char( "You are unable to locate them.\n\r", ch );
	return;
    }

    if ( IS_SET(victim->in_room->room_flags, ROOM_PRIVATE)
    ||   IS_SET(victim->in_room->room_flags, ROOM_SOLITARY) )
    {
	send_to_char( "Nothing happens.\n\r", ch );
	return;
    }

    if ( ( eye = ch->pcdata->familiar ) != NULL )
    {
	if ( eye->pIndexData->vnum == MOB_VNUM_EYE )
	{
	    send_to_char( "You have switched the target of your Omnipotence.\n\r",ch );
	    char_from_room( eye );
	    char_to_room( eye, victim->in_room );
	    if ( eye->master != NULL ) stop_follower( eye );
	    eye->master        = victim;
	    eye->leader        = NULL;
	}
	else
	    send_to_char("Nothing happens.\n\r",ch);
	return;
    }

    if (ch->pcdata->followers > 4 || victim->in_room == NULL)
    {
	send_to_char("Nothing happens.\n\r",ch);
	return;
    }

    ch->pcdata->followers++;

    eye=create_mobile( get_mob_index( MOB_VNUM_EYE ) );
    eye->level = 1;
    eye->hit = 1;
    eye->max_hit = 1;
    eye->hitroll = 0;
    eye->damroll = 0;
    eye->armor = 100;
    eye->alignment = 0;

    free_string(eye->name);
    eye->name = str_dup("eye eyeball");
    free_string(eye->short_descr);
    eye->short_descr = str_dup("a small spectral eye");
    free_string(eye->long_descr);
    eye->long_descr = str_dup("A small spectral eye floats here.\n\r");
    free_string(eye->lord);
    eye->lord = str_dup(ch->name);

    send_to_char( "You are now using your Omnipotence.\n\r",ch );

    char_to_room( eye, victim->in_room );
    ch->pcdata->familiar = eye;
    eye->wizard = ch;

    if ( eye->master != NULL )
    {
	send_to_char( "Bug - please inform Morglum.\n\r", ch );
	return;
    }

    eye->master        = victim;
    eye->leader        = NULL;
    SET_BIT(eye->more, MORE_SPIRIT);
    SET_BIT(eye->vampaff, VAM_SPIRITEYES);
    SET_BIT(eye->act, ACT_NOEXP);
    SET_BIT(eye->act, ACT_NOPARTS);
    SET_BIT(eye->affected_by, AFF_ETHEREAL);
    SET_BIT(eye->affected_by, AFF_FLYING);
    return;
}

DO_COM( do_baal )
{
    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_LAMIA) < 4)
    {
	send_to_char("You require level 4 Lamia 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;
}

DO_COM( do_servant )
{
    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;
}

DO_COM( do_frenzy )
{
    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;
}

DO_COM( do_flames )
{
    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;
}