fallen/
fallen/new_stuff/
fallen/player/
fallen/player/backup/
fallen/player/store/
	/*   Daemons   */

#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"

void frost_breath args(( CHAR_DATA *ch, CHAR_DATA *victim, bool all));
void fire_effect  args(( void *vo, int level, int dam, int target));
DECLARE_DO_FUN( do_stance );

void do_leech(CHAR_DATA *ch, char *argument)
{
	CHAR_DATA *victim = NULL;
	int cost;

	cost = (number_range(700,1000));

    if (IS_NPC(ch) || !IS_CLASS(ch, CLASS_DEMON))
    {
	send_to_char("Huh?\r\n", ch);
	return;
    }
    if (ch->power[DISC_DAEM_NETH] < 4)
    {
		stc("You must obtain a level 4 mastery of Nether first.\n\r",ch);
		return;
    }

    if (argument[0] == '\0')
    {
		stc("Who's life do you wish to leech off of?\n\r", ch);
		return;
    }

    if ((victim = get_char_room(ch, argument)) == NULL)
    {
	    stc("They aren't here.\n\r", ch);
	    return;
    }

    if (is_safe(ch, victim))
		return;
	
	if (ch->move <(cost+500))
	{
	send_to_char("Get more moves first.\n",ch);
	return;
	}

	WAIT_STATE(ch, 10);

	act("$n stares intently at $N.", ch, NULL, victim, TO_NOTVICT);
	act("You stare intently at $N.", ch, NULL, victim, TO_CHAR);
	act("$n stares intently at you.", ch, NULL, victim, TO_VICT);

    if (victim->hit >= 1000)
    {
		victim->hit -= number_range( (700 + ch->power[DISC_DAEM_NETH]),(1000 + ch->power[DISC_DAEM_NETH]) );
        ch->hit += number_range( 700, 1000 );
	ch->move -= (cost+500);
		if (ch->hit >= ch->max_hit + 200)
			ch->hit = ch->max_hit + 200;
    }
    else
		stc("Nothing seemed to happen.\n\r",ch);
        WAIT_STATE(ch, 6);
	return;

        
}

void do_entomb (CHAR_DATA *ch, char *argument)
{
    int door;

    if (IS_NPC(ch) || !IS_CLASS(ch, CLASS_DEMON) )
    {
	send_to_char("Huh?\n\r",ch);
	return;
    }

    if (ch->power[DISC_DAEM_GELU] < 6)
    {
		stc("You must achieve a level six mastery of Geluge to use Entomb.\n\r",ch);
		return;
    }

    if (ch->in_room->sector_type == SECT_AIR)
    {
		send_to_char("This ability cannot be used in the air.\n\r", ch);
		return;
    }

    if (!TIME_UP(ch, TIMER_ENTOMB) && ch->level < 12)
    {
		send_to_char("This ability can only be used once every 12 hours.\n\r", ch);
		return;
    }

    for (door = 0 ; door < 4 ; door++)
    {
		if (ch->in_room->exit[door] != NULL)
			make_wall(ch->in_room, door, EX_ICE_WALL);
    }

    ch->hit = ch->max_hit;
    ch->move = ch->max_move;
    SET_TIMER(ch, TIMER_ENTOMB, 12);

    act("$n calls forth sheets of ice, blocking your path in every direction.", ch, NULL, NULL, TO_ROOM);
    send_to_char("You call forth sheets of ice to entrap your prey.\n\r", ch);
    act("$n melts into a puddle of slime on the floor, which drains away.", ch, NULL, NULL, TO_ROOM); 
    send_to_char("You teleport to safety.\n\r", ch);

    char_from_room(ch);
    char_to_room(ch, get_room_index(3054));
    act("$n forms out of the ground in front of you.", ch, NULL, NULL, TO_ROOM);
    do_look(ch, "auto");
    WAIT_STATE(ch, 20);
}

void do_gust( CHAR_DATA *ch, char *argument )
{
    CHAR_DATA       *victim;
    ROOM_INDEX_DATA *to_room = NULL;
    EXIT_DATA       *pexit;
    EXIT_DATA       *pexit_rev;
    char            buf       [MAX_INPUT_LENGTH];
    char            direction [MAX_INPUT_LENGTH];
    char            arg1      [MAX_INPUT_LENGTH];
    char            arg2      [MAX_INPUT_LENGTH];
    int             door;
    int             rev_dir;
    int             dam;
     
    argument = one_argument( argument, arg1 );
    argument = one_argument( argument, arg2 );
    if (IS_NPC(ch) || !IS_CLASS(ch, CLASS_DEMON))
    {
	send_to_char("Huh?\n\r",ch);
	return;
    }


    if (ch->power[DISC_DAEM_GELU] < 7)
    {
	stc("You must achieve a level seven mastery of Geluge to use Gust.\n\r",ch);
	return;

    }

    if (!TIME_UP(ch, TIMER_CAN_GUST) && ch->level < 120)
    {
	send_to_char("You are out of breath.\n\r", ch);
	return;
    }
     
    if ( arg1[0] == '\0' )
    {
        send_to_char("Who do you wish to blow a gust of wind at?\n\r", ch);
        return;
    }
    if ( ( victim = get_char_room( ch, arg1 ) ) == NULL )
    {
        send_to_char("They are not here.\n\r", ch);
        return;
    }
    
    if ( victim == ch )
    {
        send_to_char( "Not on yourself!\n\r", ch );
        return;
    }
     
    if ( is_safe( ch, victim ) )
      return;
     
    if ( victim->size > ch->size)
    {
        send_to_char("They are too large to affect.\n\r",ch);
        return;
    }
    
    WAIT_STATE( ch, 12 );
    if ( !IS_NPC(ch) && number_percent( )/2 > ch->power[DISC_DAEM_GELU] + ch->generation)
    {
            send_to_char("You huff and puff but they do not budge.\n\r",ch);
	    act("$n blows a gust of cold air into the room.", ch, NULL, NULL, TO_ROOM);
            return;
    }
    SET_TIMER(ch, TIMER_CAN_GUST, dice(1,3)+1);    
    act("You breathe a gust of cold air at $N.", ch, NULL, victim, TO_CHAR);
    act("$n breathes a gust of cold air at $N.", ch, NULL, victim, TO_NOTVICT);
    act("$n breathes a gust of cold air at you.", ch, NULL, victim, TO_VICT);

    rev_dir = 0;
    if ( arg2[0] == '\0' )
        door = number_range(0,3);
    else
    {
        if      ( !str_prefix( arg2, "north" ) )
            door = 0;
        else if ( !str_prefix( arg2, "east" ) )
            door = 1;
        else if ( !str_prefix( arg2, "south" ) )
            door = 2;
        else if ( !str_prefix( arg2, "west" ) )
            door = 3;
        else
        {
            send_to_char("You can only blow people north, south, east or west.\n\r", ch);
            return;
        }
    }
     
    if (door == 0) {sprintf(direction,"north");rev_dir = 2;}
    if (door == 1) {sprintf(direction,"east");rev_dir = 3;}
    if (door == 2) {sprintf(direction,"south");rev_dir = 0;}
    if (door == 3) {sprintf(direction,"west");rev_dir = 1;}
     
    if (( pexit = ch->in_room->exit[door]) == NULL)
    {
        sprintf(buf,"$N flies into the %s wall.", direction);
        act(buf,ch,NULL,victim,TO_NOTVICT);
        sprintf(buf,"$N flies into the %s wall.", direction);
        act(buf,ch,NULL,victim,TO_CHAR);
        sprintf(buf,"You smash into the %s wall.", direction);
        act(buf,ch,NULL,victim,TO_VICT);
        dam = dice(victim->size*3+1, ch->power[DISC_DAEM_GELU] * 3);
	  damage_old(ch, victim, dam, 0, DAM_OTHER, FALSE);
        return;
    }
    
    pexit = victim->in_room->exit[door];
    if (IS_SET(pexit->exit_info, EX_CLOSED) )
    {
        if (IS_SET(pexit->exit_info, EX_LOCKED))
            REMOVE_BIT(pexit->exit_info, EX_LOCKED);
        if (IS_SET(pexit->exit_info, EX_CLOSED))
            REMOVE_BIT(pexit->exit_info, EX_CLOSED);
        sprintf(buf,"$N is blown into the air and flies %s.", direction);
        act(buf,ch,NULL,victim,TO_NOTVICT);
        sprintf(buf,"$N is blown into the air and flies %s.", direction);
        act(buf,ch,NULL,victim,TO_CHAR);
        sprintf(buf,"You are blown into the air and fly %s.", direction);
        act(buf,ch,NULL,victim,TO_VICT);
        sprintf(buf,"There is a loud crash as $n smashes through the $d.");
        act(buf,victim,NULL,pexit->keyword,TO_ROOM);
     
        if ( ( to_room   = pexit->to_room               ) != NULL && ( pexit_rev = to_room->exit[rev_dir] ) != NULL
        &&   pexit_rev->to_room == ch->in_room && pexit_rev->keyword != NULL )
        {
            if (IS_SET(pexit_rev->exit_info, EX_LOCKED))
                REMOVE_BIT( pexit_rev->exit_info, EX_LOCKED );
            if (IS_SET(pexit_rev->exit_info, EX_CLOSED))
                REMOVE_BIT( pexit_rev->exit_info, EX_CLOSED );
            if (door == 0) sprintf(direction,"south");
            if (door == 1) sprintf(direction,"west");
            if (door == 2) sprintf(direction,"north");
            if (door == 3) sprintf(direction,"east");
            char_from_room(victim);
            char_to_room(victim,to_room);
            sprintf(buf,"$n comes smashing in through the %s $d.", direction);
            act(buf,victim,NULL,pexit->keyword,TO_ROOM);
            dam = dice(victim->size*3+1, ch->power[DISC_DAEM_GELU] * 7);
	    	damage_old(ch, victim, dam, 0, DAM_OTHER, FALSE);
        }
    }
    else
    {
        sprintf(buf,"$N flies %s.", direction);
        act(buf,ch,NULL,victim,TO_NOTVICT);
        sprintf(buf,"$N flies %s.", direction);   
        act(buf,ch,NULL,victim,TO_CHAR);
        sprintf(buf,"You fly %s.", direction);  
        act(buf,ch,NULL,victim,TO_VICT);
        if (door == 0) sprintf(direction,"south");
        if (door == 1) sprintf(direction,"west");
        if (door == 2) sprintf(direction,"north");
        if (door == 3) sprintf(direction,"east");
	  char_from_room(victim);
        char_to_room(victim,pexit->to_room);
        sprintf(buf,"$n comes flying in from the %s.", direction);
        act(buf,victim,NULL,NULL,TO_ROOM);
        dam = dice(victim->size*3+1, ch->power[DISC_DAEM_GELU] * 5);
	  damage_old(ch, victim, dam, 0, DAM_OTHER, FALSE);
    }
    return;
}

void do_caust(CHAR_DATA *ch, char *argument)
{
    OBJ_DATA *obj;

    if (IS_NPC(ch) || !IS_CLASS(ch, CLASS_DEMON))
    {
	send_to_char("Huh?\n\r",ch);
	return;
    }


    if (ch->power[DISC_DAEM_CORR] < 4)
    {
		stc("You must obtain level four Corruption to use Caust.\n\r",ch);
		return;
    }

    if (argument[0] == '\0')
    {
		send_to_char("Which item do you wish to caust?\n\r", ch);
		return;
    }

    if ( (obj = get_obj_carry(ch, argument)) == NULL)
    {
		send_to_char("You are not carrying that item.\n\r", ch);
		return;
    }

    if (obj->item_type != ITEM_WEAPON)
    {
		send_to_char("That is not a weapon!\n\r", ch);
		return;
    }

    if (dice(1, 100) == 1)
    {
		act("$p is disintegrated by $n's poison.", ch,obj, NULL, TO_ROOM);
		act("Your poison eats through $p.", ch,obj, NULL, TO_CHAR);
		extract_obj(obj);
		return;
    }

    if (IS_WEAP(obj, WEAPON_POISON))
    {
		act("$p is already coated with deadly poison.", ch, obj, NULL, TO_CHAR);
		return;
    }

    act("You run your tongue along $p, coating it with a sickly venom.", ch, obj, NULL, TO_CHAR);
    act("$n runs $m tongue along $p, coating it with a sickly venom.", ch, obj, NULL, TO_ROOM);

    WAIT_STATE(ch, 8);
    SET_BIT(obj->weapflags, WEAPON_POISON);
    obj->value[1] += ch->generation;
    obj->value[2] += ch->generation;
}

void do_chaosport( CHAR_DATA *ch, char *argument )
{

    if (IS_NPC(ch) || !IS_CLASS(ch, CLASS_DEMON))
    {
	send_to_char("Huh?\r\n", ch);
	return;
    }


    if (ch->power[DISC_DAEM_DISC] < 4)
    {
		stc("You need at least level 4 in Discord to use Chaos Portal\n\r",ch);
		return;
    }

    if (ch->fighting != NULL)
    {
		if (number_range(1,3) == 1)
		{
			stc("The powers of Chaos fail you.\n\r",ch);
		    act("$n tries in vain to summon a chaos portal.",ch,NULL,NULL,TO_ROOM);
		    return;
		}	
    }
    if (ch->fight_timer > 0)
    {
     send_to_char("The powers of Chaos fail you!\n\r",ch);
     return;
    }
	if ((ch->in_room->vnum >= 50) && (ch->in_room->vnum <= 68))
	{
		send_to_char("You cannot activate a transporter out whilst you are in the arena.\n\r", ch);
		return;
	}
    act("$n disappears through a rift in time.",ch,NULL,NULL,TO_ROOM);
    stc("You are swept away through a rift in time.\n\r",ch);
    if (ch->fighting != NULL)
        stop_fighting( ch, TRUE );
    char_from_room(ch);
    char_to_room(ch, get_random_room(ch));
    stc("You reappear in a swirling storm of chaos.\n\r",ch);
    act("$n appears in a swirling wind of Chaos.",ch,NULL,NULL,TO_ROOM);
    do_look(ch,"auto");
    SET_TIMER(ch, TIMER_CHAOSPORT, 10);
    return;
}


void do_bane (CHAR_DATA *ch, char *argument )
{

    char buf [MAX_INPUT_LENGTH];
    char arg [MAX_STRING_LENGTH];
    CHAR_DATA *victim;
    int blah;
    AFFECT_DATA af;
    argument=one_argument(argument,arg);
    if (IS_NPC(ch)) return;
    if (!IS_CLASS(ch, CLASS_DEMON))
     {
    send_to_char("Huh?\n\r",ch);
    return;
     }
if (arg[0]=='\0')
{
send_to_char("Summon what?\n\r",ch);
send_to_char("L1-Hound, L2-Wight, L3-Mdemon, L4-Ldemon, L5-Gdemon.\n\r",ch);
send_to_char("L6-Garg, L7-Reaper, L8-Succub, L9-Ghoul, L10-Cerebus.\n\r",ch);
return;
}

blah=ch->power[DISC_DAEM_CORR];

  if (ch->pcdata->followers > 2)
  {
   send_to_char("You can't seem to summon any of your minions.\n\r",ch);
   return;
  }
  ch->pcdata->followers++;
  victim=create_mobile( get_mob_index( 30000 ) );
  if (!str_cmp(arg,"hound")&& blah>0)
 {
  free_string(victim->short_descr);
  free_string(victim->name);
  free_string(victim->long_descr);
  victim->name=str_dup("hound");
  victim->short_descr=str_dup("A Hell Hound");
  victim->long_descr=str_dup("A hound of hell snarls at you.");
  victim->level = 50;
  victim->hit = 450;
  victim->max_hit = 450;
  victim->hitroll = 50;
  victim->damroll = 50;
 }
else if (!str_cmp(arg,"wight")&& blah>1)
 {
  free_string(victim->short_descr);
  free_string(victim->name);
  free_string(victim->long_descr);
  victim->name=str_dup("wight");
  victim->short_descr=str_dup("An Evil Wight");
  victim->long_descr=str_dup("An Evil Wight glares evilly at you.");
  victim->level = 60;
  victim->hit = 500;
  victim->max_hit = 500;
  victim->hitroll = 60;
  victim->damroll = 60;
 }
else if (!str_cmp(arg,"mdemon")&& blah>2)
 {
  free_string(victim->short_descr);
  free_string(victim->name);
  free_string(victim->long_descr);
  victim->name=str_dup("mdemon");
  victim->short_descr=str_dup("A Minor Demon");
  victim->long_descr=str_dup("A Minor Demon forms here from the depths of hell.");
  victim->level = 70;
  victim->hit = 600;
  victim->max_hit = 600;
  victim->hitroll = 70;
  victim->damroll = 70;
 }
else if (!str_cmp(arg,"ldemon")&& blah>3)
 {
  free_string(victim->short_descr);
  free_string(victim->name);
  free_string(victim->long_descr);
  victim->name=str_dup("ldemon");
  victim->short_descr=str_dup("A Lesser Demon");
  victim->long_descr=str_dup("A Lesser Demon rises up out of the ground.");
  victim->level = 80;
  victim->hit = 1000;
  victim->max_hit = 1000;
  victim->hitroll = 90;
  victim->damroll = 90;
 }
else if (!str_cmp(arg,"gdemon")&& blah>4)
 {
  free_string(victim->short_descr);
  free_string(victim->name);
  free_string(victim->long_descr);
  victim->name=str_dup("gdemon");
  victim->short_descr=str_dup("A Greater Demon");
  victim->long_descr=str_dup("A Greater Demon emits an ear piercing scream.");
  victim->level = 90;
  victim->hit = 3000;
  victim->max_hit = 3000;
  victim->hitroll = 100;
  victim->damroll = 100;
 }
else if (!str_cmp(arg,"garg")&& blah>5)
 {
  free_string(victim->short_descr);
  free_string(victim->name);
  free_string(victim->long_descr);
  victim->name=str_dup("garg");
  victim->short_descr=str_dup("A Huge Obsidian Gargoyle");
  victim->long_descr=str_dup("A Huge Obsidian Gargoyle animates to life.");
  victim->level = 100;
  victim->hit = 900;
  victim->max_hit = 900;
  victim->hitroll = 100;
  victim->damroll = 100;
 }
else if (!str_cmp(arg,"reaper")&& blah>6)
 {
  free_string(victim->short_descr);
  free_string(victim->name);
  free_string(victim->long_descr);
  victim->name=str_dup("reaper");
  victim->short_descr=str_dup("A Skeletal Reaper");
  victim->long_descr=str_dup("A Skeletal Reaper swings his huge scythe at you.");
  victim->level = 150;
  victim->hit = 1250;
  victim->max_hit = 1250;
  victim->hitroll = 150;
  victim->damroll = 150;
 }
else if (!str_cmp(arg,"succub")&& blah>7)
 {
  free_string(victim->short_descr);
  free_string(victim->name);
  free_string(victim->long_descr);
  victim->name=str_dup("succub");
  victim->short_descr=str_dup("A Succubus");
  victim->long_descr=str_dup("A beautiful woman stands here smiling at you.");
  victim->level = 200;
  victim->hit = 1500;
  victim->max_hit = 1500;
  victim->hitroll = 200;
  victim->damroll = 200;
 }
else if (!str_cmp(arg,"ghoul")&& blah>8)
 {
  free_string(victim->short_descr);
  free_string(victim->name);
  free_string(victim->long_descr);
  victim->name=str_dup("ghoul");
  victim->short_descr=str_dup("A Ghoul");
  victim->long_descr=str_dup("A horridly disfigured ghoul lurks here.");
  victim->level = 300;
  victim->hit = 3000;
  victim->max_hit = 3000;
  victim->hitroll = 250;
  victim->damroll = 250;
 }
else if (!str_cmp(arg,"cerebus")&& blah>9)
 {
  free_string(victim->short_descr);
  free_string(victim->name);
  free_string(victim->long_descr);
  victim->name=str_dup("cereb");
  victim->short_descr=str_dup("Cerebus");
  victim->long_descr=str_dup("A mammoth hound of Cerebus stands here snarling.");
  victim->level = 400;
  victim->hit = 5000;
  victim->max_hit = 5000;
  victim->hitroll = 300;
  victim->damroll = 300;
 }
else 
 {
send_to_char("You have failed in the art of summoning and have summoned a weaker partner.\n\r",ch);
 }

    sprintf(buf,"%s screams as they are pulled from their reality.\n\r",victim->short_descr);
    send_to_char(buf,ch);
    
    act(buf,ch,NULL,NULL,TO_ROOM);
    sprintf(buf,"%s\n\r",victim->long_descr);
    free_string(victim->long_descr);
    victim->long_descr=str_dup(buf);
    char_to_room( victim, ch->in_room );
    add_follower( victim, ch );
    af.duration  = 666;
    af.location  = APPLY_NONE;
    af.modifier  = 0;
    af.bitvector = AFF_CHARM;
    affect_to_char( victim, &af );
    SET_BIT(victim->act,ACT_NOEXP);
    SET_BIT(victim->act,PLR_HOLYLIGHT);
    do_group(ch,victim->name);
    return;
 }
 
void do_unnerve(CHAR_DATA *ch, char *argument)
{
    CHAR_DATA *victim;
	if (IS_NPC(ch))
		return;
	if (!IS_CLASS(ch, CLASS_DEMON))
	{
		send_to_char("Huh?\n\r",ch);
		return;
	}


    if (ch->power[DISC_DAEM_DISC] < 1)
    {
		stc("You need a level one mastery of Discord to use Unnerve.\n\r",ch);
		return;
    }

    if (argument[0] == '\0')
    {
		stc("Who do you wish to unnerve?\n\r", ch);
		return;
    }

    if ( ( victim = get_char_room(ch, argument) ) == NULL)
    {
		stc("They aren't here.\n\r", ch);
		return;
    }
    if (IS_NPC(victim))
   {
		stc("They can't stance.\n\\r", ch);
		return;
   }

    WAIT_STATE(ch, 7);
    do_say(ch,"#1Xeus Dominus Mortai!#n");
    do_stance(victim, "");
}

void do_wfreeze(CHAR_DATA *ch, char *argument)
{
    OBJ_DATA *obj;
	if (IS_NPC(ch))
		return;
	if (!IS_CLASS(ch, CLASS_DEMON))
	{
		send_to_char("Huh?\n\r",ch);
		return;
	}


    if (ch->power[DISC_DAEM_GELU] < 1)
    {
		stc("You need a level one mastery of Geluge to freeze a weapon.\n\r",ch);
		return;
    }

    if (argument[0] == '\0')
    {
		send_to_char("Which item do you wish to freeze?\n\r", ch);
		return;
    }

    if ( (obj = get_obj_carry(ch, argument)) == NULL)
    {
		send_to_char("You are not carrying that item.\n\r", ch);
		return;
    }

    if (obj->item_type != ITEM_WEAPON)
    {
		send_to_char("That is not a weapon!\n\r", ch);
		return;
    }

    if (dice(1, 100) == 1)
    {
		act("$p freezes and shatters.", ch,obj, NULL, TO_ROOM);
		act("$p freezes and shatters.", ch,obj, NULL, TO_CHAR);
		extract_obj(obj);
		return;
    }

    if (IS_WEAP(obj, WEAPON_FROST))
    {
		act("$p is already frozen.", ch, obj, NULL, TO_CHAR);
		return;
    }

    act("$p is surrounded by ice crystals.", ch, obj, NULL, TO_CHAR);
    act("$p, carried by $n is surrounded by ice crystals.", ch, obj, NULL, TO_ROOM);

    WAIT_STATE(ch, 8);
    SET_BIT(obj->weapflags, WEAPON_FROST);
}



void do_transform( CHAR_DATA *ch, char *argument )
{
    OBJ_DATA *obj;
    int trans = 0;

	if (IS_NPC(ch))
		return;
	if (!IS_CLASS(ch, CLASS_DEMON))
	{
		send_to_char("Huh?\n\r",ch);
		return;
	}


    if (ch->power[DISC_DAEM_MORP] < 2)
    {
		stc("You must obtain a level two mastery of Morphosis.\n\r",ch);
		return;
    }
    if (ch->fight_timer > 0)
    { 
               stc("You may not transform with a fight timer.\n\r",ch);
               return;
    }
    if (argument[0] == '\0')
    {
        send_to_char("You can transform into the following items:\n\r",ch);
        send_to_char("    A Daemonic Helm\n\r",ch);
        if (ch->power[DISC_DAEM_MORP] > 2)
            send_to_char("    Black Steel Greaves\n\r",ch);
        if (ch->power[DISC_DAEM_MORP] > 3)
		{
            send_to_char("    A Black Opera Cloak\n\r",ch);
            send_to_char("    Daemonic Plate Armor\n\r",ch);
		}
        if (ch->power[DISC_DAEM_MORP] > 4)
		{
            send_to_char("    Ring of Cacophony\n\r",ch);
            send_to_char("    Blood-Ruby Sword\n\r",ch);
		}
        if (ch->power[DISC_DAEM_MORP] > 5)
            send_to_char("    Shield of Bone\n\r",ch);
        return;
    }

    if (!str_cmp(argument, "back") )
    {
		if ( ( obj = ch->pcdata->chobj ) == NULL )
		{
			send_to_char("You are already in human form.\n\r",ch);
			return;
		}

		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 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 (!str_prefix(argument, "helm") && ch->power[DISC_DAEM_MORP] > 1)
		trans = OBJ_VNUM_DHELM;
	else if (!str_prefix(argument, "greaves") && ch->power[DISC_DAEM_MORP] > 2)
		trans = OBJ_VNUM_DGREAVES;
    else if (!str_prefix(argument, "cloak")	&& ch->power[DISC_DAEM_MORP] > 3)
		trans = OBJ_VNUM_DCLOAK;
    else if (!str_prefix(argument, "armor")	&& ch->power[DISC_DAEM_MORP] > 3)
		trans = OBJ_VNUM_DARMOR;
    else if (!str_prefix(argument, "ring") && ch->power[DISC_DAEM_MORP] > 4)
		trans = OBJ_VNUM_DRING;
    else if (!str_prefix(argument, "sword")	&& ch->power[DISC_DAEM_MORP] > 4)
		trans = OBJ_VNUM_DSWORD;
    else if (!str_prefix(argument, "shield") && ch->power[DISC_DAEM_MORP] > 5)
		trans = OBJ_VNUM_DSHIELD;
    else
    {
		do_transform(ch, "");
		return;
    }	

    if ((obj = create_object(get_obj_index(trans),60)) == NULL)
    {
		send_to_char( "You are unable to polymorph into that weapon.\n\r", ch);
		return;
    }

    if (IS_AFFECTED(ch,AFF_WEBBED))
    {
		send_to_char( "Not with all this sticky webbing on.\n\r", ch);
		return;
    }

    obj_to_room(obj,ch->in_room);
    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);
    ch->pcdata->obj_vnum = trans;
    obj->chobj = ch;
    ch->pcdata->chobj = obj;
    SET_BIT(ch->affected_by, AFF_POLYMORPH);
    SET_BIT(ch->extra, EXTRA_OSWITCH);
    SET_TIMER(ch, TIMER_DAEMONIC_TRANSFORM , 24);
    free_string(ch->morph);
sprintf(log_buf,"#1[#2%s#1]#6%s", ch->pcdata->switchname, obj->short_descr);
    ch->morph = str_dup(log_buf);
    if (!str_cmp(argument, "sword"))
    {
		SET_BIT(obj->weapflags, WEAPON_FLAMING);
		SET_BIT(obj->weapflags, WEAPON_VAMPIRIC);
		SET_BIT(obj->weapflags, WEAPON_FROST);
		SET_BIT(obj->weapflags, WEAPON_SUNBLADE);
		SET_BIT(obj->weapflags, WEAPON_ELE_EARTH);
		SET_BIT(obj->weapflags, WEAPON_ELE_AIR);
		SET_BIT(obj->weapflags, WEAPON_SHOCKING);
    }
    return;
}


int get_polymorph_power (CHAR_DATA *ch)
{
    if (ch->class == CLASS_DEMON)
		return ch->power[DISC_DAEM_MORP] - 1;

    if (ch->level == 12)
		return 100;

    return 0;
}

void do_polymorph (CHAR_DATA *ch, char *argument)
{
    int i, col = 0;
    char buf[MAX_INPUT_LENGTH];
    bool changed = FALSE;


    if (ch->power[DISC_DAEM_MORP] < 2 )
    {
		stc("You require level 2 morphosis.\n\r",ch);
		return;
    }

    if (argument[0] == '\0')
    {
		stc("Syntax : polymorph [<form> list back]\n\r", ch);
		return;
    }

    if (!str_cmp(argument, "list"))
    {
		cent_to_char("Available forms", ch);
		cent_to_char("---===> <===---", ch);

		for (i = 0 ; i < MAX_FORMS ; i++)
		{
			if (form_data[i].polymorph_level > 0 && form_data[i].polymorph_level <= get_polymorph_power(ch)
			&& form_data[i].lookname != NULL )
			{
				sprintf(buf, "   %-12s", form_data[i].lookname);
				stc(buf, ch);
				if ( ++col % 5 == 0)
					send_to_char("\n\r", ch);
			}
		}
		if (col % 5 != 0)
			stc("\n\r", ch);
		return;
    }

    if (!str_cmp(argument, "back"))
    {
		if (ch->cur_form == get_normal_form(ch))
		{
			stc("You are already in your normal form.\n\r", ch);
			return;
		}
		sprintf(buf, "$n polymorphs back into %s.",
	    GET_PROPER_NAME(ch));
		act(buf, ch, NULL, NULL, TO_ROOM);
        stc("You return to your demonic form.\n\r", ch);
		set_form(ch, get_normal_form(ch) );
		WAIT_STATE(ch, 7);
		return;
    }

    if (!TIME_UP(ch, TIMER_CAN_POLYMORPH) && ch->level != 12)
    {
        stc("You have not got enough energy to polymorph so soon.\n\r", ch);
        return;
    }

    for ( i = 0 ; i < MAX_FORMS ; i++ )
    {
		if (form_data[i].lookname != NULL && !str_prefix(argument, form_data[i].lookname)
	    && form_data[i].polymorph_level > 0  && form_data[i].polymorph_level <= get_polymorph_power(ch) )
		{
			if (ch->cur_form == i)
			{
				stc("You are already in that form.\n\r", ch);
				return;
  			}
			changed = TRUE;
			sprintf(buf, "$n transforms into a%s %s.", (is_vowel(form_data[i].lookname[0])) ? "n" : "",
			form_data[i].lookname);
			act(buf, ch, NULL, NULL, TO_ROOM);

			sprintf(buf, "You transform into a%s %s.\n\r",(is_vowel(form_data[i].lookname[0])) ? "n" : "",
			form_data[i].lookname);
			stc(buf, ch);
			WAIT_STATE(ch, 8);
			set_form(ch, i);
			SET_TIMER(ch, TIMER_CAN_POLYMORPH, dice(2, 3) );
		}
    }	 
    if (!changed)    
		stc("No forms of that name found.\n\r", ch);
    return;
}

void do_hellfire (CHAR_DATA *ch, char *argument)
{
    int door;
	if (IS_NPC(ch))
		return;
	if (!IS_CLASS(ch, CLASS_DEMON))
	{
		send_to_char("Huh?\n\r",ch);
		return;
	}


    if (ch->power[DISC_DAEM_HELL] < 7)
    	return;

    if (ch->in_room->sector_type == SECT_AIR)
    {
		send_to_char("This ability cannot be used in the air.\n\r", ch);
		return;
    }

    if ( IS_SET(ch->in_room->room_flags,ROOM_SAFE) )
    {
		stc("You cannot desecrate this Holy Place.\n\r",ch);
		return;
    }

    if (!TIME_UP(ch, TIMER_HELLFIRE_SUMMON) && ch->level < 12)
    {
		send_to_char("This ability can only be used once every 12 hours.\n\r", ch);
		return;
    }

    for (door = 0 ; door < 4 ; door++)
    {
		if (ch->in_room->exit[door] != NULL)
			make_wall(ch->in_room, door, EX_FIRE_WALL);
    }

    SET_TIMER(ch, TIMER_HELLFIRE_SUMMON, 12);
    stc("You summon the fires of hell!\n\r",ch);
    act("$n summons the Abyssal fires of Hell!",ch,NULL,NULL,TO_ROOM);
}

const sh_int  revdir [6] =
{
    2, 3, 0, 1, 5, 4
};

void put_wall(ROOM_INDEX_DATA *room, int dir, int wall)
{
    int timer;

    timer = dice(2, 2);

    switch (dir)
    {
	case DIR_NORTH :
	    SET_RTIMER(room, RTIMER_WALL_NORTH, timer);
	    SET_RTIMER(room->exit[dir]->to_room, RTIMER_WALL_SOUTH, timer);
	break;
	case DIR_EAST :
	    SET_RTIMER(room, RTIMER_WALL_EAST, timer);
	    SET_RTIMER(room->exit[dir]->to_room, RTIMER_WALL_WEST, timer);
	break;
	case DIR_SOUTH :
	    SET_RTIMER(room, RTIMER_WALL_SOUTH, timer);
	    SET_RTIMER(room->exit[dir]->to_room, RTIMER_WALL_NORTH, timer);
	break;
	case DIR_WEST :
	    SET_RTIMER(room, RTIMER_WALL_WEST, timer);
	    SET_RTIMER(room->exit[dir]->to_room, RTIMER_WALL_EAST, timer);
	break;
	case DIR_UP :
	    SET_RTIMER(room, RTIMER_WALL_UP, timer);
	    SET_RTIMER(room->exit[dir]->to_room, RTIMER_WALL_DOWN, timer);
	break;
	case DIR_DOWN :
	    SET_RTIMER(room, RTIMER_WALL_DOWN, timer);
	    SET_RTIMER(room->exit[dir]->to_room, RTIMER_WALL_UP, timer);
	break;
    }	
    room->exit[dir]->exit_info = wall;

}

void make_wall(ROOM_INDEX_DATA *room, int dir, int wall)
{
    int was;
    bool makewall = TRUE;

    if (dir < 0 || dir > 5)
    {
	bug("Invalid direction (create wall)", 0);
	return;
    }

    if (room->exit[dir] == NULL)
    {
	bug ("Cant make wall!!!!", 0);
	return;
    }

    was = room->exit[dir]->exit_info;

    if (was == EX_ICE_WALL && wall == EX_FIRE_WALL)
    {
        room_message(room, "The wall of ice bursts into flames.");
        room_message(room->exit[dir]->to_room, "The wall of ice bursts into flames.");
    }

    if (was == EX_FIRE_WALL && wall == EX_ICE_WALL)
    {
        room_message(room, "The wall of flames flickers blue for a second.");
        room_message(room->exit[dir]->to_room, "The wall of flames flickers blue for a second.");
	makewall = FALSE;
    }

    if (makewall) put_wall(room, dir, wall);

    if (room->exit[dir]->to_room == NULL)
    {
	bug("Exit doesnt lead anywhere (create wall).", 0);
	return;
    }

    if (room->exit[dir]->to_room->exit[revdir[dir]] == NULL)
    {
	bug("Reverse Exit doesnt lead anywhere (create wall).", 0);
	return;
    }

    if (makewall) put_wall(room->exit[dir]->to_room, revdir[dir], wall);
}

ROOM_INDEX_DATA * locate_obj (OBJ_DATA *obj)
{
    if (obj->in_obj != NULL)
        return locate_obj(obj->in_obj);

    if (obj->carried_by != NULL)
	return obj->carried_by->in_room;

    return obj->in_room;
}

void do_seed(CHAR_DATA *ch, char *argument)
{
    OBJ_DATA *obj;
	if (IS_NPC(ch))
		return;
	if (!IS_CLASS(ch, CLASS_DEMON))
	{
		send_to_char("Huh?\n\r",ch);
		return;
	}


    if (ch->power[DISC_DAEM_HELL] < 7)
    {
		stc("You must obtain a level seven Mastery of the Hellfire Discipline.\n\r",ch);
		return;
	}

    if ( IS_SET(ch->in_room->room_flags,ROOM_SAFE) )
    {
	stc("You cannot desecrate this Holy Place!\n\r",ch);
	return;
    }

    if (argument[0] == '\0')
    {
	send_to_char("Which item do you wish to plant with Deamonseed?\n\r", ch);
	return;
    }

    if ((obj = get_obj_carry(ch, argument) ) == NULL)
    {
	send_to_char("You do not have that item in your inventory.\n\r",ch);
	return;
    }
  
    if (IS_OBJ_STAT2(obj, ITEM_DAEMONSEED) )
    {
	send_to_char("That item is already set to explode.\n\r", ch);
	return;
    }

    if (IS_OBJ_STAT(obj, ITEM_BLESS)
	|| IS_OBJ_STAT(obj, ITEM_ANTI_EVIL) )
    {
	send_to_char("You cannot affect such a holy item.\n\r", ch);
	return;
    }

    if (IS_SET(obj->quest, QUEST_ARTIFACT)
	|| IS_SET(obj->quest, QUEST_RELIC) )
    {
	send_to_char("You cannot affect such a powerful item.\n\r", ch);
	return;
    }

    if (obj->pIndexData->vnum == OBJ_VNUM_SEVERED_HEAD)
    {
	send_to_char("Not on severed heads!\n\r",ch);
	return;
    }

    act("$p starts to shudder and vibrate in your hands.", ch, obj, NULL, TO_CHAR);
    act("$n lays $s hands on $p.", ch, obj, NULL, TO_ROOM);

    WAIT_STATE(ch, 12);
    SET_BIT(obj->extra_flags2, ITEM_DAEMONSEED);
    obj->timer = ch->generation / 2 + dice(1,3);
}


void do_immolate(CHAR_DATA *ch, char *argument)
{
    OBJ_DATA *obj;
	if (IS_NPC(ch))
		return;
	if (!IS_CLASS(ch, CLASS_DEMON))
	{
		send_to_char("Huh?\n\r",ch);
		return;
	}


    if (ch->power[DISC_DAEM_HELL] < 2)
    {
	stc("You must obtain a level 2 mastery of Hellfire.\n\r",ch);
	return;
    }

    if (argument[0] == '\0')
    {
	send_to_char("Which item do you wish to immolate?\n\r", ch);
	return;
    }

    if ( (obj = get_obj_carry(ch, argument)) == NULL)
    {
	send_to_char("You are not carrying that item.\n\r", ch);
	return;
    }

    if (obj->item_type != ITEM_WEAPON)
    {
	send_to_char("That is not a weapon!\n\r", ch);
	return;
    }

    if (dice(1, 100) == 1)
    {
	act("$p explodes in a burst of flames.", ch,obj, NULL, TO_ROOM);
	act("$p explodes in a burst of flames.", ch,obj, NULL, TO_CHAR);
        damage(ch,ch,500,gsn_inferno);
	extract_obj(obj);
	return;
    }

    if (IS_WEAP(obj, WEAPON_FLAMING))
    {
	act("$p is already flaming.", ch, obj, NULL, TO_CHAR);
	return;
    }

    act("$p bursts into flames.", ch, obj, NULL, TO_CHAR);
    act("$p, carried by $n bursts into flames.", ch, obj, NULL, TO_ROOM);

    WAIT_STATE(ch, 8);
    SET_BIT(obj->weapflags, WEAPON_FLAMING);
}

void do_destroy (CHAR_DATA *ch, char *argument)
{
    char arg[MAX_INPUT_LENGTH];
    CHAR_DATA *victim;

    argument = one_argument( argument, arg );
	if (IS_NPC(ch))
		return;
	if (!IS_CLASS(ch, CLASS_DEMON))
	{
		send_to_char("Huh?\n\r",ch);
		return;
	}

    
    if (ch->power[DISC_DAEM_HELL] < 5)
    {
	send_to_char("Only true masters of the hellfire discipline may use this ability.\n\r", ch);
	return;
    }


    if ( arg[0] == '\0' )
    {
	send_to_char( "Which daemon do you wish to destroy?\n\r", ch );
	return;
    }

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

    if ( victim == ch )
    {
	send_to_char("You cannot destroy yourself.\n\r",ch);
	return;
    }

    if ( victim->class != ch->class && ch->level != 120)
    {
	send_to_char("You may only destroy daemons.\n\r",ch);
	return;
    }

    if ( victim->generation >= ch->generation)
    {
	send_to_char("They are too powerful to destroy.\n\r",ch);
	return;
    }
    
    if (ch->generation < 12)
    {
	send_to_char("Only Pit Fiends or above may use the destroy ability.\n\r", ch);
	return;
    }

    if ( str_cmp(ch->clan, victim->clan) )
    {
	send_to_char("They are not in your clan.\n\r", ch);
	return;
    }

    ch->alignment -= 30;
    if (ch->alignment < -1000) ch->alignment = -1000;

    act("You breathe out a huge gout of abyssal flame and incinerate $N.", ch, NULL, victim, TO_CHAR);
    act("$n breathes out a huge gout of abyssal flame and incinerates you.", ch, NULL, victim, TO_VICT);
    act("$n breathes out a huge gout of flame and incinerates $N.", ch, NULL, victim, TO_NOTVICT);
    send_to_char("You have been KILLED!", victim);
    act("$n drops dead.", victim, NULL, NULL, TO_ROOM);
    victim->hit = -10;
    victim->move /= 3;
    update_pos(victim);
}

void do_dinferno(CHAR_DATA *ch, char *argument)
{
    CHAR_DATA *vch, *vch_next;
    
    if (ch->power[DISC_DAEM_HELL] < 3)
    {
	send_to_char("You need more experience in the Hellfire discipline.\n\r", ch);
	return;
    }

    if ( ch->hit > 0 )
    {
	send_to_char("This is only used as a last resort.\n\r",ch);
	return;
    }

    act("$n explodes, sending forth a massive fireballs in all directions.",ch,NULL,NULL,TO_ROOM);
    send_to_char("You explode in a huge blast of abyssal flame.\n\r",ch);
    for (vch = ch->in_room->people; vch != NULL; vch = vch_next)
    {
	    vch_next = vch->next_in_room;
	    if (vch != ch)
	    {
		damage(vch, ch, ch->power[DISC_DAEM_HELL] * number_range(80,100), gsn_inferno);
		damage(ch, ch, ch->power[DISC_DAEM_HELL] * number_range(250,300), gsn_inferno);
		fire_effect(vch, ch->level, 2000, TARGET_CHAR);
	    }
    }
    WAIT_STATE(ch, 56);
    ch->hit = -10;
    SET_TIMER(ch, TIMER_INFERNO, (20 - ch->generation) * 5);
    raw_kill( ch );
}   

void acid_effect(void *vo, int level, int dam, int target)
{
    if (target == TARGET_ROOM) /* nail objects on the floor */
     {
	ROOM_INDEX_DATA *room = (ROOM_INDEX_DATA *) vo;
	OBJ_DATA *obj, *obj_next;

	for (obj = room->contents; obj != NULL; obj = obj_next)
	{
	    obj_next = obj->next_content;
	    acid_effect(obj,level,dam,TARGET_OBJ);
	}
	return;
    }

    if (target == TARGET_CHAR)  /* do the effect on a victim */
    {
	CHAR_DATA *victim = (CHAR_DATA *) vo;
	OBJ_DATA *obj, *obj_next;

	/* let's toast some gear */
	for (obj = victim->carrying; obj != NULL; obj = obj_next)
	{
	    obj_next = obj->next_content;
	    acid_effect(obj,level,dam,TARGET_OBJ);
	}
	return;
    }

    if (target == TARGET_OBJ) /* toast an object */
    {
	OBJ_DATA *obj = (OBJ_DATA *) vo;
	OBJ_DATA *t_obj,*n_obj;
	int chance;
	char *msg;

	
	chance = level / 4 + dam / 10;

	if (chance > 25)
	    chance = (chance - 25) / 2 + 25;
	 if (chance > 50)
	    chance = (chance - 50) / 2 + 50;

	if (IS_OBJ_STAT(obj,ITEM_BLESS))
	    chance -= 5;

	chance -= obj->level * 2;

	switch (obj->item_type)
	{
	    default:
		return;
	    case ITEM_CONTAINER:
	    case ITEM_CORPSE_PC:
	    case ITEM_CORPSE_NPC:
		msg = "$p fumes and dissolves.";
		break;
	    case ITEM_STAFF:
	    case ITEM_WAND:
		chance -= 10;
		msg = "$p corrodes and breaks.";
		break;
	    case ITEM_SCROLL:
		chance += 10;
		msg = "$p is burned into waste.";
		break; 
	}

	chance = URANGE(5,chance,95);

	if (number_percent() > chance)
	    return;

	if (IS_SET(obj->quest, QUEST_SPELLPROOF))
	    return;

	if (obj->carried_by != NULL)
	    act(msg,obj->carried_by,obj,NULL,TO_ALL);
	else if (obj->in_room != NULL && obj->in_room->people != NULL)
	    act(msg,obj->in_room->people,obj,NULL,TO_ALL);

	/* get rid of the object */
	if (obj->contains)  /* dump contents */
	{
	    for (t_obj = obj->contains; t_obj != NULL; t_obj = n_obj)
	    {
		n_obj = t_obj->next_content;
		obj_from_obj(t_obj);
		if (obj->in_room != NULL)
		    obj_to_room(t_obj,obj->in_room);
		else if (obj->carried_by != NULL)
		    obj_to_room(t_obj,obj->carried_by->in_room);
		else
		{
		    extract_obj(t_obj);
		    continue;
		}

		acid_effect(t_obj,level/2,dam/2,TARGET_OBJ);
	    }
 	}

	extract_obj(obj);
	return;
    }
}


void shock_effect(void *vo,int level, int dam, int target)
{
    if (target == TARGET_ROOM)
    {
	ROOM_INDEX_DATA *room = (ROOM_INDEX_DATA *) vo;
	OBJ_DATA *obj, *obj_next;

	for (obj = room->contents; obj != NULL; obj = obj_next)
	{
	    obj_next = obj->next_content;
	    shock_effect(obj,level,dam,TARGET_OBJ);
	}
	return;
    }

    if (target == TARGET_CHAR)
    {
	CHAR_DATA *victim = (CHAR_DATA *) vo;
	OBJ_DATA *obj, *obj_next;

	/* toast some gear */
	for (obj = victim->carrying; obj != NULL; obj = obj_next)
	{
	    obj_next = obj->next_content;
	    shock_effect(obj,level,dam,TARGET_OBJ);
	}
	return;
    }

    if (target == TARGET_OBJ)
    {
	OBJ_DATA *obj = (OBJ_DATA *) vo;
	int chance;
	char *msg;

	chance = level / 4 + dam / 10;

	if (chance > 25)
	    chance = (chance - 25) / 2 + 25;
	if (chance > 50)
	    chance = (chance - 50) /2 + 50;

	if (IS_OBJ_STAT(obj,ITEM_BLESS))
	    chance -= 5;

 	chance -= obj->level * 2;

	switch(obj->item_type)
	{
	    default:
		return;
	   case ITEM_WAND:
	   case ITEM_STAFF:
		chance += 10;
		msg = "$p overloads and explodes!";
		break;
	}

	chance = URANGE(5,chance,95);

	if (number_percent() > chance)
	    return;

	if (IS_SET(obj->quest, QUEST_SPELLPROOF))
	    return;

	if (obj->carried_by != NULL)
	    act(msg,obj->carried_by,obj,NULL,TO_ALL);
	else if (obj->in_room != NULL && obj->in_room->people != NULL)
	    act(msg,obj->in_room->people,obj,NULL,TO_ALL);

	extract_obj(obj);
	return;
    }
}	

void fire_effect(void *vo, int level, int dam, int target)
{
    if (target == TARGET_ROOM)  /* nail objects on the floor */
    {
	ROOM_INDEX_DATA *room = (ROOM_INDEX_DATA *) vo;
	OBJ_DATA *obj, *obj_next;

	for (obj = room->contents; obj != NULL; obj = obj_next)
	{
	    obj_next = obj->next_content;
	    fire_effect(obj,level,dam,TARGET_OBJ);
	}
	return;
    }

    if (target == TARGET_CHAR)   /* do the effect on a victim */
    {
	CHAR_DATA *victim = (CHAR_DATA *) vo;
	OBJ_DATA *obj, *obj_next;

	/* chance of blindness */
	if (!IS_AFFECTED(victim,AFF_BLIND))
	{
            AFFECT_DATA af;
            act("$n is blinded by smoke!",victim,NULL,NULL,TO_ROOM);
            act("Your eyes tear up from smoke...you can't see a thing!",
		victim,NULL,NULL,TO_CHAR);

            af.type         = skill_lookup("fire breath");
            af.duration     = number_range(0,level/10);
            af.location     = APPLY_HITROLL;
            af.modifier     = -20;
            af.bitvector    = AFF_BLIND;

            affect_to_char(victim,&af);
	}

	/* let's toast some gear! */
	for (obj = victim->carrying; obj != NULL; obj = obj_next)
	{
	    obj_next = obj->next_content;
	    fire_effect(obj,level,dam,TARGET_OBJ);
        }
	return;
    }

    if (target == TARGET_OBJ)  /* toast an object */
    {
	OBJ_DATA *obj = (OBJ_DATA *) vo;
	OBJ_DATA *t_obj,*n_obj;
	int chance;
	char *msg;

        chance = level / 4 + dam / 10;
 
        if (chance > 25)
            chance = (chance - 25) / 2 + 25;
        if (chance > 50)
            chance = (chance - 50) / 2 + 50;

        if (IS_OBJ_STAT(obj,ITEM_BLESS))
            chance -= 5;
        chance -= obj->level * 2;

        switch ( obj->item_type )
        {
        default:         
	    return;
        case ITEM_CONTAINER:
            msg = "$p ignites and burns!";
            break;
        case ITEM_POTION:
            chance += 25;
            msg = "$p bubbles and boils!";
            break;
        case ITEM_SCROLL:
            chance += 50;
            msg = "$p crackles and burns!";
            break;
        case ITEM_STAFF:
            chance += 10;
            msg = "$p smokes and chars!";
            break;
        case ITEM_WAND:
            msg = "$p sparks and sputters!";
            break;
        case ITEM_FOOD:
            msg = "$p blackens and crisps!";
            break;
        case ITEM_PILL:
            msg = "$p melts and drips!";
            break;
        }

        chance = URANGE(5,chance,95);

        if (number_percent() > chance)
            return;
 
	if (IS_SET(obj->quest, QUEST_SPELLPROOF))
            return;      

	if (obj->carried_by != NULL)
            act( msg, obj->carried_by, obj, NULL, TO_ALL );
	else if (obj->in_room != NULL && obj->in_room->people != NULL)
	    act(msg,obj->in_room->people,obj,NULL,TO_ALL);

        if (obj->contains)
        {
            /* dump the contents */
 
            for (t_obj = obj->contains; t_obj != NULL; t_obj = n_obj)
            {
                n_obj = t_obj->next_content;
                obj_from_obj(t_obj);
		if (obj->in_room != NULL)
                    obj_to_room(t_obj,obj->in_room);
		else if (obj->carried_by != NULL)
		    obj_to_room(t_obj,obj->carried_by->in_room);
		else
		{
		    extract_obj(t_obj);
		    continue;
		}
		fire_effect(t_obj,level/2,dam/2,TARGET_OBJ);
            }
        }

        extract_obj( obj );
	return;
    }
}

void do_stigmata( CHAR_DATA *ch, char *argument )
{
    CHAR_DATA *victim;
	char buf[MAX_STRING_LENGTH];
    char arg [MAX_INPUT_LENGTH];
	int touchdamage;

    argument = one_argument( argument, arg );

    if (IS_NPC(ch)) 
		return;
	else if (!IS_CLASS(ch, CLASS_DEMON) )
	{
		send_to_char("Huh?\n\r", ch);
		return;
	}
	else if (ch->level < 3)
	{
		send_to_char("Huh?\n\r", ch);
		return;
	}
	else if (ch->move < 2000)
	{
		send_to_char("You do not have the vitality to do this\n\r", ch);
		return;
	}
    else if ( arg[0] == '\0' )
    {
		send_to_char( "Who do you wish to attack with a stigmata?\n\r", ch );
		return;
    }
    else if ( ( victim = get_char_room( ch, arg ) ) == NULL )
    {
		send_to_char( "They aren't here.\n\r", ch );
		return;
    }
	else if (victim->level < 3)
	{
		send_to_char("You cannot do that to them.\n\r", ch);
		return;
	}
	else if ( is_safe( ch, victim ) )
	{
		send_to_char("You cannot seem to do it.\n\r", ch);
		return;
	}
	else
	{

		if (IS_ITEMAFF(ch, ITEMA_SPEED))
		{
			touchdamage = number_range(1500,(ch->move / 3));
			ch->move -= touchdamage + 4000 ;
                  ch->fight_timer += 10;
	     	}
	
		else
		{
			touchdamage =number_range(1500,(ch->move / 2.97));
        	    ch->move -= ch->move/3;
                ch->fight_timer += 10;
 		}
touchdamage *= 1.4;
if (IS_NPC(victim)) touchdamage *= 2;	
		if (touchdamage > 0)
		{
			sprintf(buf,"You chant at $N cursing him with the hand of Satan! [%d]\n\r",touchdamage);
			act(buf,ch,NULL,victim,TO_CHAR);
			sprintf(buf,"You feel the raw power of the stigmata![%d]\n\r",touchdamage);
			act(buf,ch,NULL,victim,TO_VICT);
			sprintf(buf,"$n grins and prays to Satan to destroy $N [%d]\n\r",touchdamage);
			act(buf,ch,NULL,victim,TO_NOTVICT);
			WAIT_STATE(ch, 10);
			hurt_person(ch,victim,touchdamage);
		}
	}
}
void do_graft(CHAR_DATA *ch, char *argument)
{
    OBJ_DATA *obj;
    char arg[MAX_INPUT_LENGTH];
    argument = one_argument(argument, arg);

    if (IS_NPC(ch) || !IS_CLASS(ch, CLASS_DEMON) )
    {
	send_to_char("Huh?\r\n", ch);
	return;
    }


    if (ch->power[DISC_DAEM_ATTA] < 5)
    {
	send_to_char("You need to research attack to five before you can graft.\r\n", ch);
	return;
    }
    if ( arg[0] == '\0')
    {
	stc("Which limb do you wish to graft on to yourself?\n\r",ch);
	return;
    }

    if ( ( obj = get_obj_carry(ch,arg) ) == NULL )
    {
	stc("You do not have that limb.\n\r",ch);
	return;
    }

    if (!IS_SET(obj->extra_flags2, ITEM_ARM))
    {
	stc("That's not even an arm!\n\r",ch);
	return;
    }

    if (IS_SET(ch->newbits, THIRD_HAND) && IS_SET(ch->newbits, FOURTH_HAND))
    {
        stc("You already have four arms!\n\r",ch);
        return;
    }

    if (!IS_SET(ch->newbits, FOURTH_HAND))
    {
        act("You graft an arm onto your body.",ch,NULL,obj,TO_CHAR);
        act("$n grafts an arm onto $m body.",ch,NULL,obj,TO_ROOM);
        SET_BIT(ch->newbits, FOURTH_HAND);
        SET_TIMER(ch, TIMER_FOURTH_ARM_GOING, dice(ch->generation, 6) );
        WAIT_STATE(ch, 18);
	extract_obj(obj);
        return;    
    }

    if (!IS_SET(ch->newbits, THIRD_HAND))
    {
        act("You graft an arm onto your body.",ch,NULL,obj,TO_CHAR);
        act("$n grafts an arm onto $m body.",ch,NULL,obj,TO_ROOM);
        SET_BIT(ch->newbits, THIRD_HAND);
        SET_TIMER(ch, TIMER_THIRD_ARM_GOING, dice(ch->generation, 6) );
        WAIT_STATE(ch, 18);
	extract_obj(obj);
        return;    
    }    

    return;
}

/* Trying to make sense of Demons Listy */
/*
void do_shadowdemon(CHAR_DATA *ch, char *argument)
{
      char buf[MAX_STRING_LENGTH];
      char arg[MAX_INPUT_LENGTH];
      char *fname;
      int form;

      argument = one_argument(argument, arg);
	if (IS_NPC(ch))
		return;
	if (!IS_CLASS(ch, CLASS_DEMON))
	{
		send_to_char("Huh?\n\r",ch);
		return;
	}


      if (ch->power[DISC_DAEM_TEMP] < 6)
      {
          stc("You must obtain level six in Temptation to use Shadow Demon.\n\r",ch);
          return;
      }

      if (arg[0] == '\0')
      {
          stc("What demonic form do you wish to mimic?\n\r",ch);
	  return;
      }

      if (!str_cmp(arg, "return") && ch->cur_form == get_normal_form(ch))
      {
          stc("You are already in your normal demonic form!\n\r",ch);
          return;
      }

	     if (!str_cmp(arg, "lemure"   )) form = FRM_LEMURE;
      else if (!str_cmp(arg, "nupperibo")) form = FRM_NUPPERIBO;
      else if (!str_cmp(arg, "spinagon" )) form = FRM_SPINAGON;
      else if (!str_cmp(arg, "barbazu"  )) form = FRM_BARBAZU;
      else if (!str_cmp(arg, "abishai"  )) form = FRM_ABISHAI;
      else if (!str_cmp(arg, "osyluth"  )) form = FRM_OSYLUTH;
      else if (!str_cmp(arg, "hamatula" )) form = FRM_HAMATULA;
      else if (!str_cmp(arg, "erinyes"  )) form = FRM_ERINYES;
      else if (!str_cmp(arg, "amnizu"   )) form = FRM_AMNIZU;
      else if (!str_cmp(arg, "cornugon" )) form = FRM_CORNUGON;
      else if (!str_cmp(arg, "gelugon"  )) form = FRM_GELUGON;
      else if (!str_cmp(arg, "return"   )) form = get_normal_form(ch);
      else
      {
        stc("That is an invalid demonic form.\n\r",ch);
        return;
      }

      if ((form - 23) <= ch->generation)
      {
          fname = str_dup(ch->name);
          stc("Your skin slowly melts away and you form a puddle on the floor.\n\r",ch);
          act("$n's body slowly melts into a puddle on the ground.",ch,NULL,NULL,TO_ROOM);
          set_form(ch, form);
          sprintf(buf,"Your body slowly reforms as %s.",ch->name);
          stc(buf,ch);
          sprintf(buf,"%s's body slowly reforms as %s.",fname,ch->name);
          act(buf,ch,NULL,NULL,TO_ROOM);
          return;
      }
          
	
}*/


void do_dgate( CHAR_DATA *ch, char *argument )
{
    char arg1[MAX_INPUT_LENGTH];
    DESCRIPTOR_DATA *d;
    CHAR_DATA *victim;
	
    argument = one_argument( argument, arg1 );
	if (IS_NPC(ch))
		return;
	if (!IS_CLASS(ch, CLASS_DEMON))
	{
		send_to_char("Huh?\n\r",ch);
		return;
	}


    if ( arg1[0] == '\0' )
    {
	send_to_char( "Gate whom?\n\r", ch );
	return;
    }
    if (number_range(0,1)==1)
    {
	send_to_char("You lost you concentration!\r\n", ch);
	return;
    }

    if ( !str_cmp( arg1, "all" ) )
    {
	if ( ch->generation < 12 )
	{
	    send_to_char("You do not yet have the power to gate all demons.\n\r",ch);
	}
	else
	{
		for ( d = descriptor_list; d != NULL; d = d->next )
		{
		    if ( d->connected == CON_PLAYING
		    &&   d->character != ch
		    &&   d->character->in_room != NULL
		    &&   can_see( ch, d->character ) 
		    &&   d->character->generation < ch->generation
		    &&   d->character->class == CLASS_DEMON)
		    {
			if ( d->character->fighting != NULL ) stop_fighting( d->character, TRUE );
			    act( "A scaly hand reaches down and drags $n away.", d->character, NULL, NULL, TO_ROOM );
			    char_from_room( d->character );
			    char_to_room( d->character, ch->in_room );
			    act( "You have successfully gated $N.", ch, NULL, d->character, TO_CHAR );
			    act( "$n has successfully gated $N.", ch, NULL, d->character, TO_NOTVICT );
			    if ( ch != d->character )
				act( "$n has pulled you through the demonic void.", ch, NULL, d->character, TO_VICT );
			    do_look( d->character, "auto" );
			    send_to_char( "Ok.\n\r", ch );			
		    }
		}
	}
	return;
    }
 
    if ( ( victim = get_char_world( ch, arg1 ) ) == NULL )
    {
	send_to_char( "They aren't here.\n\r", ch );
	return;
    }

    if ( victim->class != CLASS_DEMON )
    {
	send_to_char( "You may only gate in demons.\n\r", ch );
	return;
    }

    if ( victim->in_room == NULL )
    {
	send_to_char( "They are in limbo.\n\r", ch );
	return;
    }

    if ( victim->generation >= ch->generation )
    {
	send_to_char("You may only gate one of lesser power than yourself.\n\r",ch);
	return;
    }    

    if ( number_range(1, ch->generation) == 1 )
    {
	send_to_char("Your powers seem to have failed you.\n\r",ch);
	send_to_char("You hear demonic chanting in the distance.\n\r",victim);
	return;
    }
    
    if ( victim->fighting != NULL ) stop_fighting( victim, TRUE );
    act( "A scaly hand reaches down and drags $n away.", victim, NULL, NULL, TO_ROOM );
    char_from_room( victim );
    char_to_room( victim, ch->in_room);
    act( "You have successfully gated $N.", ch, NULL, victim, TO_CHAR );
    act( "$n has successfully gated $N.", ch, NULL, victim, TO_NOTVICT );
    if ( ch != victim )
	act( "$n has pulled you through the demonic void.", ch, NULL, victim, TO_VICT );
    do_look( victim, "auto" );
    send_to_char( "Ok.\n\r", ch );
    WAIT_STATE(ch, 12);
}

void do_frostbreath (CHAR_DATA *ch, char *argument)
{
    CHAR_DATA *victim;
    char arg[MAX_STRING_LENGTH];

    argument = one_argument(argument, arg);
	if (IS_NPC(ch))
		return;
	if (!IS_CLASS(ch, CLASS_DEMON))
	{
		send_to_char("Huh?\n\r",ch);
		return;
	}

    if (ch->power[DISC_DAEM_GELU] < 2)
    {
	stc("You must obtain level two in Geluge to use Frostbreath.\n\r",ch);
	return;
    }

    if (!TIME_UP(ch, TIMER_CAN_BREATHE_FROST) && ch->level < 12)
    {
	send_to_char("You are out of breath.\n\r", ch);
	return;
    }

    if (arg[0] == '\0')
    {
	send_to_char("Who do you wish to breathe on?\n\r", ch);
	return;
    }

    if (!str_cmp(arg, "all"))
    {
      CHAR_DATA *vch, *vch_next;
      for (vch = ch->in_room->people; vch != NULL; vch = vch_next)
      {
          vch_next = vch->next_in_room;
          if (vch == ch) continue;

  	  if (is_safe(ch,vch) 
	  &&   (ch->fighting != vch || vch->fighting != ch))
	     continue;

        WAIT_STATE(ch, 24);
        SET_TIMER(ch, TIMER_CAN_BREATHE_FROST, 11 - ch->generation / 2);
        frost_breath(ch, vch, TRUE);
      }
    }

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

    WAIT_STATE(ch, 12);
    SET_TIMER(ch, TIMER_CAN_BREATHE_FROST, 9 - ch->generation / 2);
    frost_breath(ch, victim, FALSE);
}


void cold_effect(void *vo, int level, int dam, int target)
{
    if (target == TARGET_ROOM) /* nail objects on the floor */
    {
        ROOM_INDEX_DATA *room = (ROOM_INDEX_DATA *) vo;
        OBJ_DATA *obj, *obj_next;
 
        for (obj = room->contents; obj != NULL; obj = obj_next)
        {
            obj_next = obj->next_content;
            cold_effect(obj,level,dam,TARGET_OBJ);
        }
        return;
    }

    else if (target == TARGET_CHAR) /* whack a character */
    {
	CHAR_DATA *victim = (CHAR_DATA *) vo;
	OBJ_DATA *obj, *obj_next;

	/* chill touch effect */
	    AFFECT_DATA af;

            af.type      = skill_lookup("chill touch");
            af.duration  = 4;
            af.location  = APPLY_STR;
            af.modifier  = -1;
            af.bitvector = 0;
            affect_join( victim, &af );

	/* let's toast some gear */
	for (obj = victim->carrying; obj != NULL; obj = obj_next)
	{
	    obj_next = obj->next_content;
	    cold_effect(obj,level,dam,TARGET_OBJ);
	}
	return;
   }

   else if (target == TARGET_OBJ) /* toast an object */
   {
	OBJ_DATA *obj = (OBJ_DATA *) vo;
	int chance;
	char *msg;

	chance = level / 5 + dam / 10;

	if (chance > 25)
	    chance = (chance - 25) / 2 + 25;
	if (chance > 50)
	    chance = (chance - 50) / 2 + 25;

	if (IS_OBJ_STAT(obj,ITEM_BLESS))
	    chance -= 5;

 	chance -= obj->level * 2;

	switch(obj->item_type)
	{
	    default:
		return;
	    case ITEM_POTION:
		msg = "$p freezes and shatters!";
		chance += 25;
		break;
	    case ITEM_DRINK_CON:
		msg = "$p freezes and shatters!";
		chance += 5;
		break;
	}

	chance = URANGE(5,chance,95);

	if (number_percent() > chance)
	    return;

	if (IS_SET(obj->quest, QUEST_SPELLPROOF))
            return;

	if (obj->carried_by != NULL)
	    act(msg,obj->carried_by,obj,NULL,TO_ALL);
	else if (obj->in_room != NULL && obj->in_room->people != NULL)
	    act(msg,obj->in_room->people,obj,NULL,TO_ALL);

	extract_obj(obj);
	return;
    }
}


void frost_breath(CHAR_DATA *ch, CHAR_DATA *victim, bool all)
{
    CHAR_DATA *vch, *vch_next;
    int dam;
    int power;

    if (IS_CLASS(ch, CLASS_DEMON)) power = ch->power[DISC_DAEM_GELU];
    else power = 0;

    if (all)
    {
	dam = (ch->generation + 1 * power) * 3;
	
        act("$n breathes forth a stream of frost over you.",ch,NULL,NULL,TO_ROOM);
        act("You breath forth a stream of frost.",ch,NULL,NULL,TO_CHAR);

        for (vch = ch->in_room->people; vch != NULL; vch = vch_next)
        {
	    vch_next = vch->next_in_room;
	    if (vch == ch) continue;

	    if (is_safe(ch,vch) 
	    &&   (ch->fighting != vch || vch->fighting != ch))
	        continue;

		cold_effect(vch,ch->spl[RED_MAGIC],dam,TARGET_CHAR);
		damage(ch,vch,dam,skill_lookup("frost breath"));
	}
	return;
    }

    if (is_safe(ch, victim)) return;
    dam = (ch->generation +1 * power) * 2;

    act("$n breathes forth a stream of frost over $N.",ch,NULL,victim,TO_NOTVICT);
    act("$n breathes a stream of frost over you!",ch,NULL,victim,TO_VICT);
    act("You breath forth a stream of frost over $N.",ch,NULL,victim,TO_CHAR);
    
    damage(ch,victim,dam,skill_lookup("frost breath"));
    cold_effect(victim,ch->spl[RED_MAGIC],dam,TARGET_CHAR);
}

void do_demonic( CHAR_DATA *ch, char *argument )
{
    OBJ_INDEX_DATA *pObjIndex;
    OBJ_DATA *obj;
    char arg[MAX_INPUT_LENGTH];
    int vnum = 0;

    argument = one_argument( argument, arg );

    if (IS_NPC(ch)) return;

    if (!IS_CLASS(ch, CLASS_DEMON))
    {
	if (!IS_SET(ch->special, SPC_CHAMPION) || !IS_SET(ch->special, SPC_PRINCE))
	{
	    send_to_char("Huh?\n\r",ch);
	    return;
	}
    }

    if (arg[0] == '\0')
    {
	send_to_char("Please specify which piece of demon armor you wish to make: Ring Collar\n\rPlate Helmet Leggings Boots Gauntlets Sleeves Cape Belt Bracer Visor Longsword Shortsword.\n\r",ch);
	return;
    }
    if      (!str_cmp(arg,"ring"     )) vnum = 29650;
    else if (!str_cmp(arg,"collar"   )) vnum = 29651;
    else if (!str_cmp(arg,"plate"    )) vnum = 29652;
    else if (!str_cmp(arg,"helmet"   )) vnum = 29653;
    else if (!str_cmp(arg,"leggings" )) vnum = 29654;
    else if (!str_cmp(arg,"boots"    )) vnum = 29655;
    else if (!str_cmp(arg,"gauntlets")) vnum = 29656;
    else if (!str_cmp(arg,"sleeves"  )) vnum = 29657;
    else if (!str_cmp(arg,"cape"     )) vnum = 29658;
    else if (!str_cmp(arg,"belt"     )) vnum = 29659;
    else if (!str_cmp(arg,"bracer"   )) vnum = 29660;
    else if (!str_cmp(arg,"visor"    )) vnum = 29661;
    else if (!str_cmp(arg,"longsword"   )) vnum = 29662;
    else if (!str_cmp(arg,"shortsword"   )) vnum = 29663;
    else
    {
	send_to_char("Please specify which piece of demon armor you wish to make: Ring Collar\n\rPlate Helmet Leggings Boots Gauntlets Sleeves Cape Belt Bracer Visor Longsword Shortsword.\n\r",ch);
	return;
    }
    if ( ch->pcdata->stats[DEMON_TOTAL] < 5000 || ch->pcdata->stats[DEMON_CURRENT] < 5000)
    {
	send_to_char("It costs 5000 points of power to create a piece of demon armour.\n\r",ch);
	return;
    }
    if ( vnum == 0 || (pObjIndex = get_obj_index( vnum )) == NULL)
    {
	send_to_char("Missing object, please inform Adreno.\n\r",ch);
	return;
    }
    ch->pcdata->stats[DEMON_TOTAL]   -= 5000;
    ch->pcdata->stats[DEMON_CURRENT] -= 5000;
    obj = create_object(pObjIndex, 50);
    obj_to_char(obj, ch);
    act("$p appears in your hands in a blast of flames.",ch,obj,NULL,TO_CHAR);
    act("$p appears in $n's hands in a blast of flames.",ch,obj,NULL,TO_ROOM);
    return;
}

void do_hellish( CHAR_DATA *ch, char *argument )
{
    OBJ_INDEX_DATA *pObjIndex;
    OBJ_DATA *obj;
    char arg[MAX_INPUT_LENGTH];
    int vnum = 0;

    argument = one_argument( argument, arg );

    if (IS_NPC(ch)) return;

    if (!IS_CLASS(ch, CLASS_DEMON))
    {
	send_to_char("Huh?\r\n", ch);
	return;
    }

    if (arg[0] == '\0')
    {
	send_to_char("Please specify which piece of hellish armor you wish to make: Ring Collar\n\rPlate Helmet Leggings Boots Gauntlets Sleeves Cape Belt Bracer Visor.\n\r",ch);
	return;
    }
    if      (!str_cmp(arg,"ring"     )) vnum = 27931;
    else if (!str_cmp(arg,"collar"   )) vnum = 27932;
    else if (!str_cmp(arg,"plate"    )) vnum = 27933;
    else if (!str_cmp(arg,"helmet"   )) vnum = 27934;
    else if (!str_cmp(arg,"leggings" )) vnum = 27935;
    else if (!str_cmp(arg,"boots"    )) vnum = 27936;
    else if (!str_cmp(arg,"gauntlets")) vnum = 27937;
    else if (!str_cmp(arg,"sleeves"  )) vnum = 27938;
    else if (!str_cmp(arg,"cape"     )) vnum = 27939;
    else if (!str_cmp(arg,"belt"     )) vnum = 27940;
    else if (!str_cmp(arg,"bracer"   )) vnum = 27941;
    else if (!str_cmp(arg,"visor"    )) vnum = 27942;
    else
    {
	send_to_char("Please specify which piece of hellish armor you wish to make: Ring Collar\n\rPlate Helmet Leggings Boots Gauntlets Sleeves Cape Belt Bracer Visor.\n\r",ch);
	return;
    }
    if ( ch->pcdata->stats[DEMON_TOTAL] < 7500 || ch->pcdata->stats[DEMON_CURRENT] < 7500)
    {
	send_to_char("It costs 7500 points of power to create a piece of hellish armour.\n\r",ch);
	return;
    }
    if ( vnum == 0 || (pObjIndex = get_obj_index( vnum )) == NULL)
    {
	send_to_char("Missing object, please inform Adreno.\n\r",ch);
	return;
    }
    ch->pcdata->stats[DEMON_TOTAL]   -= 7500;
    ch->pcdata->stats[DEMON_CURRENT] -= 7500;
    obj = create_object(pObjIndex, 50);
    obj_to_char(obj, ch);
    act("$p appears in your hands in a blast of flames.",ch,obj,NULL,TO_CHAR);
    act("$p appears in $n's hands in a blast of flames.",ch,obj,NULL,TO_ROOM);
    return;
}



void do_champions( CHAR_DATA *ch, char *argument )
{
    char buf[MAX_STRING_LENGTH];
    char arg[MAX_INPUT_LENGTH];
    char lord[MAX_INPUT_LENGTH];
    CHAR_DATA *gch;

    one_argument( argument, arg );

    if (IS_NPC(ch)) return;
    if (!IS_CLASS(ch, CLASS_DEMON) && !IS_SET(ch->special, SPC_CHAMPION) )
    {
	send_to_char("Huh?\n\r",ch);
	return;
    }

    if (strlen(ch->lord) < 2 && !IS_CLASS(ch, CLASS_DEMON) )
    {
	send_to_char("But you don't follow any demon!\n\r",ch);
	return;
    }

    if (IS_CLASS(ch, CLASS_DEMON)) strcpy(lord,ch->name);
	else strcpy(lord,ch->lord);
    sprintf( buf, "The champions of %s:\n\r", lord );
    send_to_char( buf, ch );
    send_to_char("[      Name      ] [ Hits ] [ Mana ] [ Move ] [  Exp  ] [       Power        ]\n\r", ch );
    for ( gch = char_list; gch != NULL; gch = gch->next )
    {
	if ( IS_NPC(gch) ) continue;
	if ( !IS_CLASS(gch, CLASS_DEMON) && !IS_SET(gch->special, SPC_CHAMPION) ) 
	    continue;
	if ( !str_cmp(ch->lord,lord) || !str_cmp(ch->name,lord))
	{
	    sprintf( buf,
	    "[%-16s] [%-6d] [%-6d] [%-6d] [%7d] [ %-9d%9d ]\n\r",
		capitalize( gch->name ),
		gch->hit,gch->mana,gch->move,
		gch->exp, gch->pcdata->stats[DEMON_CURRENT], gch->pcdata->stats[DEMON_TOTAL]);
		send_to_char( buf, ch );
	}
    }
    return;
}

void do_cull( CHAR_DATA *ch, char *argument )
{
    CHAR_DATA *victim;
    char      arg1 [MAX_INPUT_LENGTH];
    char      arg2 [MAX_INPUT_LENGTH];
    argument = one_argument( argument, arg1 );
    argument = one_argument( argument, arg2 );

    if ( IS_NPC(ch) )
		return;

	if (!IS_CLASS(ch, CLASS_DEMON) )
    {
		send_to_char( "Huh?\n\r", ch );
		return;
    }

	if (ch->generation < 13)
	{
		send_to_char("You are not a pit lord to do this\n\r", ch);
		return;
	}

    if (( arg1[0] == '\0' || arg2[0] == '\0' ))
    {
		send_to_char( "Syntax is: cull <target> <accept/banish>\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_NPC(victim) )
    {
		send_to_char( "Not on NPC's.\n\r", ch );
		return;
    }

    if ( ch == victim )
    {
		send_to_char( "Not on yourself!\n\r", ch );
		return;
    }

    if ( !IS_CLASS(victim,CLASS_DEMON) )
    {
		send_to_char( "But they are not a demon!\n\r", ch );
		return;
    }

	if ( str_cmp(ch->clan, victim->clan) && !str_cmp(arg2, "banish") )
	{
		send_to_char("They are not in your clan\n\r", ch);
		return;
	}

    if ( victim->generation == 13)
    {
		send_to_char( "You may not do this to another Pit Lord.\n\r", ch );
		return;
    }

    if ( !str_cmp(arg2,"banish") )
    {
		act("You make $N a rogue demon!",ch,NULL,victim,TO_CHAR);
		act("$n has made $N a rogue demon!",ch,NULL,victim,TO_NOTVICT);
		act("$n has made you a rogue demon!",ch,NULL,victim,TO_VICT);
		free_string(victim->clan);
		victim->clan = str_dup( "" );
		return;
    }
    
    else if ( !str_cmp(arg2,"accept") )
    {
		if (str_cmp(victim->clan, ""))
		{
			send_to_char ("You may not induct a demon from another clan\n\r", ch);
			return;
		}
		act("You induct $N into your clan!",ch,NULL,victim,TO_CHAR);
		act("$n inducts $N into $s clan!",ch,NULL,victim,TO_NOTVICT);
		act("$n inducts you into $s clan!",ch,NULL,victim,TO_VICT);
		free_string(victim->clan);
		victim->clan = str_dup( ch->clan );
		return;
    }
    return;
}

void do_firewalk( CHAR_DATA *ch, char *argument)
{
    CHAR_DATA *victim;
    char buf[MAX_STRING_LENGTH];
    char arg[MAX_INPUT_LENGTH];
    argument = one_argument(argument, arg);


    if ( IS_NPC(ch) )
	return;

    if (!IS_CLASS(ch, CLASS_DEMON))
    {
	send_to_char("Huh?\n\r",ch);
	return;
    }



	if (ch->power[DISC_DAEM_NETH] < 10)
    {
		stc("You must obtain a level 10 mastery of Nether first.\n\r",ch);
		return;
    }

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

	if (!IS_NPC(victim))
	{
	if (ch->move < 2000)
	{
    	send_to_char("Get more moves!\n\r",ch);
    	return;
	}
	}
    
    if (ch->fight_timer > 0)
    {
       send_to_char("You may not firewalk with a fight timer.\n\r", ch);
       return;
    }
    if ( arg[0] == '\0' )
    {
	send_to_char( "Firewalk to who?\n\r", ch );
	return;
    }

    if (ch == victim)
    {
	send_to_char("But you're already at yourself!\n\r",ch);
	return;
    }

    if (victim->in_room->vnum == ch->in_room->vnum)
    {
	send_to_char("But you're already there!\n\r",ch);
	return;
    }

    if ( victim->move > ch->move || IS_IMMORTAL(victim) )
    {
	send_to_char("Your fire cannot seem to reach them.\n\r", ch);
	return;
    }
	if ((ch->in_room->vnum >= 50) && (ch->in_room->vnum <= 68))
	{
		send_to_char("You cannot do this whilst you are in the arena.\n\r", ch);
		return;
	}
		if ((victim->in_room->vnum >= 50) && (victim->in_room->vnum <= 68))
	{
		send_to_char("You cannot do this whilst they are in the arena.\n\r", ch);
		return;
	}
	if (!IS_NPC(victim) && ch->level < 3)
	{
		send_to_char("You may not firewalk while mortal.\n\r", ch);
		return;
	}

    char_from_room(ch);
    char_to_room(ch,victim->in_room);

    if (IS_NPC(victim))

    {
	sprintf(buf,"You open a path of fire and step through to %s!\n\r",victim->short_descr);
	send_to_char(buf, ch);
    }

    if (!IS_NPC(victim))
    {
	sprintf(buf,"You open a path of fire and step through to %s!\n\r",victim->name);
	send_to_char(buf, ch);
	ch->move -= 2000;
	WAIT_STATE(ch, 6);
    }
    act("$n appears from a path of fire!\n\r",ch,NULL,NULL,TO_ROOM);
    do_look(ch, "auto");
    return;
}


void do_blink(CHAR_DATA *ch, char *argument)
{CHAR_DATA *victim, *vch, *vch_next;

 if (!IS_CLASS(ch,CLASS_DEMON))
 {
    stc("Huh?\n\r", ch);
    return;
 }

 if (*argument == '\0' && !ch->fighting)
 {
    stc("Blink who?\n\r", ch);
    return;
 }

 if (*argument == '\0')
    victim = ch->fighting;
 else 
 if ((victim = get_char_room(ch,argument)) == NULL)
 {
    stc("They aren't here!\n\r", ch);
    return;
 }

 if (ch->move < 2500)
 {
    stc("You need 2500 movement points to use that
\r(common, I made it good!)\n\r", ch);
    return;
 }

 ch->move -= 2000; // leave them some mv to flee with

 if (ch->fighting)
    stop_fighting(ch,TRUE);
 
 for (vch = ch->in_room->people; vch; vch = vch_next)
 {vch_next = vch->next_in_room;
    if (vch->fighting == ch)
	stop_fighting(vch,TRUE);
 }

 act("#3$n pops out of existance.#n", ch,0,0,TO_ROOM);
 stc("#3You pop out of existance.\n\r", ch);

 ch->blinkykill = victim;

 ch->flag3 |= AFF3_BLINK_1ST_RD;
WAIT_STATE(ch, PULSE_VIOLENCE*3);
 return;
}