mc25b/
/***************************************************************************
 *  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.                                               *
 *                                                                         *
 *  Dystopia Mud improvements copyright (C) 2000, 2001 by Brian Graversen  *
 *                                                                         *
 *  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.                                                  *
 ***************************************************************************/
 /***************************************************************************
 *                                 _/                            _/        *
 *      _/_/_/  _/_/      _/_/_/  _/    _/_/    _/    _/    _/_/_/         *
 *     _/    _/    _/  _/        _/  _/    _/  _/    _/  _/    _/          *
 *    _/    _/    _/  _/        _/  _/    _/  _/    _/  _/    _/           *
 *   _/    _/    _/    _/_/_/  _/    _/_/      _/_/_/    _/_/_/            *
 ***************************************************************************
 * Mindcloud Copyright 2001-2003 by Jeff Boschee (Zarius),                 *
 * Additional credits are in the help file CODECREDITS                     *
 * All Rights Reserved.                                                    *
 ***************************************************************************/

#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "merc.h"
#include "interp.h"

void do_planeshift( CHAR_DATA *ch, char *argument )
{
  if (IS_NPC(ch)) return;
  if (!IS_CLASS(ch, CLASS_LICH))
  {
    send_to_char("Huh?\n\r",ch);
    return;
  }   
  if (ch->pcdata->powers[NECROMANTIC] < 5)
  {
    send_to_char("You don't have that power yet.\n\r",ch);
    return;
  }
  if (IS_AFFECTED(ch, AFF_ETHEREAL))
  {
    REMOVE_BIT(ch->affected_by, AFF_ETHEREAL);
    act("You regain your form and become solid.",  ch, NULL, NULL, TO_CHAR);
    act("$n regains $s form and becomes solid again.",  ch, NULL, NULL, TO_ROOM);
    return;
  }
  if (has_timer(ch)) return;
  SET_BIT(ch->affected_by, AFF_ETHEREAL);
  act("You phase into the plane of spirits.", ch, NULL, NULL, TO_CHAR);
  act("$n fades almost of of existance.", ch, NULL, NULL, TO_ROOM);
  return;
}


void do_pentagram(CHAR_DATA *ch, char *argument )
{
  CHAR_DATA *victim;
  CHAR_DATA *gch;
  int pcounter = 0;
  char arg [MAX_INPUT_LENGTH];
  ROOM_INDEX_DATA *location;

  one_argument( argument, arg );
   
  if (IS_NPC(ch)) return;
  if (ch->in_room == NULL) return;
  if (!IS_CLASS(ch, CLASS_LICH))
  {
    send_to_char("Huh?\n\r",ch);
    return;
  }
  if (ch->pcdata->powers[CON_LORE] < 5)
  {
    send_to_char("I think not.\n\r",ch);
    return;
  }
  if (ch->mana < 1500)
  {
    send_to_char("And how would you do that, you got no mana.\n\r",ch);
    return;
  }
  if ( arg[0] == '\0')
  {
    send_to_char("Whom do you wish to summon with your pentagram?\n\r", ch);
    return;
  }
  if (ch->in_room != NULL)
  {
    if (IS_SET(ch->in_room->room_flags,ROOM_SAFE) )
    {
      send_to_char( "You cannot draw a pentagram in a safe room.\n\r", ch );
      return;
    }
  }
  if ((victim = get_char_world(ch, arg)) == NULL
    ||   victim == ch
    ||   victim->in_room == NULL  
    ||   victim->level > 2000
    ||   (!IS_NPC(victim) && !IS_IMMUNE(victim, IMM_SUMMON))
    ||   (IS_NPC(victim) && IS_SET(victim->act, ACT_NOSUMMON))
    ||   IS_SET(ch->in_room->room_flags, ROOM_PRIVATE)
    ||   (victim->shop_fun || victim->quest_fun)
    ||   IS_SET(ch->in_room->room_flags, ROOM_SOLITARY)
    ||   IS_SET(ch->in_room->room_flags, ROOM_ASTRAL)
    ||   IS_SET(victim->in_room->room_flags, ROOM_ASTRAL)
    ||   IS_SET(victim->in_room->room_flags, ROOM_SAFE)
    ||   victim->in_room->vnum == ch->in_room->vnum)
  {
    send_to_char( "You failed.\n\r", ch );
    return;
  }
  if (victim->position == POS_FIGHTING)
  {  
    send_to_char( "You failed, the victim was fighting someone.\n\r", ch );
    return;
  }
  gch = ch->in_room->people;
  while ((gch = gch->next_in_room) != NULL) pcounter++;
  if (pcounter > 30)
  {
    send_to_char("The room is to crowded.\n\r",ch);
    return;
  }
  location = ch->in_room;
  act("You draw a pentagram on the floor and start chanting.", ch, NULL, NULL, TO_CHAR);
  act("$n draws a pentagram on the floor and starts chanting.", ch, NULL, NULL, TO_ROOM);
  act("A pentagram forms under your feet and the world is suddenly a big blurr.", victim, NULL, NULL, TO_CHAR);
  act("A pentagram forms under $n and $e becomes blurry and fades out of existance.", victim, NULL, NULL, TO_ROOM);
  ch->mana -= 1500;
  char_from_room(victim);
  char_to_room(victim, location);
  do_look(victim, "auto");
  act("$N appears in your pentagram.", ch, NULL, victim, TO_CHAR);
  act("$N appears in $n's pentagram.", ch, NULL, victim, TO_ROOM);
  WAIT_STATE(ch, 8);
  return;
}

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

  argument = one_argument( argument, arg );

  if (IS_NPC(ch)) return;
  if (!IS_CLASS(ch, CLASS_LICH) && !IS_CLASS(ch, CLASS_UNDEAD_KNIGHT))
  {
    send_to_char("Huh?\n\r",ch);
    return;
  }
  if (IS_CLASS(ch, CLASS_LICH) && ch->pcdata->powers[NECROMANTIC] < 3)
  {
    send_to_char("You don't have that power yet.\n\r",ch);
    return;
  }
  if (IS_CLASS(ch, CLASS_UNDEAD_KNIGHT) && ch->pcdata->powers[SPIRIT] < 4)
  {
    send_to_char("You don't have that power yet. (spirit level 4).\n\r",ch);
    return;
  }
  if (ch->alignment > 0)
  {
    send_to_char("You simply can't get yourself to do this, it's way to evil.\n\r",ch);
    return;
  }
  if ((victim = get_char_room(ch, NULL, arg)) == NULL)
  {
    send_to_char("They are not here.\n\r", ch);
    return;
  }
  if (IS_NPC(victim))
  {
    send_to_char("Not on mobiles.\n\r",ch);
    return;
  }
  if (is_safe(ch,victim)) return;
  if (victim == ch)  
  {
    send_to_char("That doesn't seem like a good idea.\n\r",ch);
    return;
  }
  dam = number_range(250,1000);
  xprintf(buf,"You suck the soul out of $N and use the energy to heal yourself [%d]",dam);
  act(buf,ch,NULL,victim,TO_CHAR);
  xprintf(buf,"$n sucks at your soul, damn it's nasty, ooo, hurts to [%d]",dam);
  act(buf,ch,NULL,victim,TO_VICT);
  xprintf(buf,"$n looks at $N and grins.");
  act(buf,ch,NULL,victim,TO_NOTVICT);
  hurt_person(ch,victim,dam);
  ch->hit += dam;
  if (ch->hit > ch->max_hit) ch->hit = ch->max_hit;
  if (victim->position > POS_STUNNED)
  {
    if (ch->fighting == NULL) set_fighting(ch, victim, TRUE);
    if (victim->fighting == NULL) set_fighting(victim, ch, FALSE);
  }
  WAIT_STATE(ch,10);
  return;
}

void do_licharmor(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_LICH))
  {
    send_to_char("Huh?\n\r",ch);
    return;
  }
  if (arg[0] == '\0')
  {
    send_to_char("Please specify which piece of lich armor you wish to make: Scythe Bracer\n\r"
                 "Amulet Ring Plate Helmet Leggings Boots Gauntlets Sleeves Cloak Belt Mask.\n\r",ch);
    return;
  }
  if ( ch->practice < 100 )
  {
    send_to_char("It costs 100 points of primal to create lich equipment.\n\r",ch);
    return;
  }
  if (!str_cmp(arg,"scythe")) vnum = 33220;
  else if (!str_cmp(arg,"bracer")) vnum = 33222;
  else if (!str_cmp(arg,"amulet")) vnum = 33223;
  else if (!str_cmp(arg,"ring")) vnum = 33221;
  else if (!str_cmp(arg,"plate")) vnum = 33224;
  else if (!str_cmp(arg,"helmet")) vnum = 33225;
  else if (!str_cmp(arg,"leggings")) vnum = 33231;
  else if (!str_cmp(arg,"boots")) vnum = 33230;
  else if (!str_cmp(arg,"gauntlets")) vnum = 33228;
  else if (!str_cmp(arg,"sleeves")) vnum = 33229;
  else if (!str_cmp(arg,"cloak")) vnum = 33232;
  else if (!str_cmp(arg,"belt")) vnum = 33226;
  else if (!str_cmp(arg,"mask")) vnum = 33227;
  else
  {
    do_licharmor(ch,"");
    return;
  }
  if ( vnum == 0 || (pObjIndex = get_obj_index( vnum )) == NULL)
  {
    send_to_char("Missing object, please inform a God.\n\r",ch);
    return;
  }
  obj = create_object(pObjIndex, 50);
  obj->questowner = str_dup(ch->pcdata->switchname);
  obj->ownerid = ch->pcdata->playerid;
  obj_to_char(obj, ch);
  ch->practice -= 100;
  act("$p appears in your hands.",ch,obj,NULL,TO_CHAR);
  act("$p appears in $n's hands.",ch,obj,NULL,TO_ROOM);
  return;
}

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

  argument = one_argument( argument, arg );

  if (IS_NPC(ch)) return;
  if (!IS_CLASS(ch, CLASS_LICH))
  {
    send_to_char("Huh?\n\r",ch);
    return;
  }
  if (ch->pcdata->powers[LIFE_LORE] < 3)
  {
    send_to_char("You don't have that power yet.\n\r",ch);
    return;
  }
  if (ch->mana < 5000)
  {
    send_to_char("You don't have enough mana.\n\r",ch);
    return;
  }
  if (has_timer(ch)) return;
  if (ch->in_room != NULL)
  {
    if (IS_SET (ch->in_room->room_flags, ROOM_ARENA))
    {
      send_to_char("Your in the arena.\n\r",ch);
      return;
    }
  }
  if (in_fortress(ch))
  {
    send_to_char("Your in The Forbidden Fortress.\n\r", ch);
    return;
  }
  if ((victim = get_char_room(ch, NULL, arg)) == NULL)
  {
    send_to_char("They are not here.\n\r", ch);
    return;
  }
  if (IS_NPC(victim))
  {
    send_to_char("Not on mobiles.\n\r",ch);
    return;
  }
  if (is_safe(ch,victim)) return;
  if (victim == ch)
  {
    send_to_char("That doesn't seem like a good idea.\n\r",ch);
    return;
  }
  ch->mana -= 5000;
  act( "$n is swallowed by the earth and disappears.", victim, NULL, NULL, TO_ROOM );
  char_from_room( victim );
  char_to_room( victim, get_room_index(ROOM_VNUM_ALTAR)); 
  act( "$n is flung out of a vulcano.", victim, NULL, NULL, TO_ROOM );
  do_look(victim, "auto");
  if ((mount = victim->mount) == NULL) return;
  char_from_room( mount );
  char_to_room(mount, victim->in_room);
  do_look(mount, "auto");
  WAIT_STATE(ch, 8);
  return;
}

void do_manasuck(CHAR_DATA *ch, char *argument)
{
    CHAR_DATA *victim = NULL;
    char buf[MAX_STRING_LENGTH];

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

    if (ch->pcdata->powers[DEATH_LORE] < 5)
   {
    send_to_char("You don't have that power yet.\n\r",ch);
    return;
   }

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

    if ((victim = get_char_room(ch, NULL, argument)) == NULL)
    {
	    stc("They aren't here.\n\r", ch);
	    return;
    }
    
    if (ch->move < 8000)
    {
    	stc("Your too worn out to suck.\n\r",ch);
    	return;
    }
    
    

      if (is_safe(ch, victim)) return;

	act("#0$n shoots a #Bblue #0arc at $N.", ch, NULL, victim, TO_NOTVICT);
	act("#0You shoot a #Bblue #0arc at $N.", ch, NULL, victim, TO_CHAR);
	act("#0$n shoots a #Bblue #0arc at you.", ch, NULL, victim, TO_VICT);

      if (victim->mana > 0)
      {
	  sh_int power;
	  sh_int dam;
	  power = 90;
	  dam = dice(power, power * 2);
	  if (victim->mana < dam)
	  {
	  	dam = victim->mana;
	  }
	  else
	  {
	  victim->mana -= dam;
          }
	  ch->mana += dam;
	  ch->move -= dam * 2;
	  if (ch->move < 0)
	      ch->move = 0;
	  if (ch->mana >= ch->max_mana + 500)
		ch->mana = ch->max_mana + 500;
	  xprintf(buf,"#BYou absorb #W%d #Bmana.#n\n\r",dam);
	  stc(buf,ch);
	  xprintf(buf,"#0%s absorbed #R%d #0of your mana!#n\n\r",ch->name,dam);
	  stc(buf,victim);
	  WAIT_STATE(ch, 10);
	  }
      else stc("Nothing seemed to happen.\n\r",ch);
	return;

}

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

  argument = one_argument( argument, arg );
  dam = number_range(100,200);

  if (IS_NPC(ch)) return;
  if (!IS_CLASS(ch, CLASS_LICH))
  {
    send_to_char("Huh?\n\r",ch);
    return;
  }
  if (ch->pcdata->powers[DEATH_LORE] < 4)
  {
    send_to_char("You don't have that power yet.\n\r",ch);
    return;
  }
  if ((victim = get_char_room(ch, NULL, arg)) == NULL)
  {
    send_to_char("They are not here.\n\r", ch);
    return;
  }
  if (IS_NPC(victim))
  {
    send_to_char("Not on mobiles.\n\r",ch);
    return;
  }
  if (is_safe(ch,victim)) return;
  if (victim == ch)
  {
    send_to_char("That doesn't seem like a good idea.\n\r",ch);
    return;
  }
  WAIT_STATE(ch, 18);
  hurt_person(ch, victim, dam);
  act("You channel unholy energies into $N and watch $M writhe in pain.",ch,NULL,victim,TO_CHAR);
  act("$n looks at you, and suddenly your body is filled with intense pain.",ch,NULL,victim,TO_VICT);
  if (number_range(1,3) == 1)
  {
    if (victim->position == POS_FIGHTING) stop_fighting(victim,TRUE);
    act("$N screams in pure agony and falls to the ground.",ch,NULL,victim,TO_CHAR);
    act("AARGH!!! The pain is to much, you drop to the ground.",ch,NULL,victim,TO_VICT);
    act("$N screams in agony and falls to the ground.",ch,NULL,victim,TO_NOTVICT);
    victim->position = POS_STUNNED;
  }
  return;
}

void do_creepingdoom(CHAR_DATA *ch, char *argument)
{
  CHAR_DATA *ich;
  CHAR_DATA *dummychar=ch;
  int totaldam = ch->hit;
  int dam;
  char buf1[MAX_STRING_LENGTH]; 
  char buf2[MAX_STRING_LENGTH];
  char buf3[MAX_STRING_LENGTH];

  if (IS_NPC(ch)) return;
  if (!IS_CLASS(ch, CLASS_LICH))
  {
    send_to_char("Huh?\n\r",ch);
    return;
  }
  if (ch->pcdata->powers[DEATH_LORE] < 5)
  {
    send_to_char("You don't have that power yet.\n\r",ch);
    return;
  }
  if (ch->mana < 5000)
  {
    send_to_char("You don't have the power to summon the insects.\n\r",ch);
    return;
  }
  send_to_char("You send out a call for the insects in the area.\n\r",ch);
  for (ich = ch->in_room->people; dummychar != NULL; ich = dummychar )
  {
    if (totaldam <= 0) break;
    dummychar = ich->next_in_room;
    if (!IS_NPC(ich)) continue; 
    if (is_safe(ch,ich)) continue;
    dam = UMIN(totaldam, ich->hit + 10);
    xprintf(buf1,"$N screams in horror as insects from all over swarm over $M and starts eating [#C%d#n]" , dam);
    xprintf(buf2,"Your insects bite $N [#C%d#n]" , dam);
    xprintf(buf3,"$n laughs as insects swarm from nowhere and attack you [#C%d#n]" , dam);
    act(buf1,ch,NULL,ich, TO_NOTVICT);
    act(buf2,ch,NULL,ich, TO_CHAR);
    act(buf3,ch,NULL,ich, TO_VICT);
    hurt_person(ch,ich,dam);
    totaldam -= dam;
    if (ich->position > POS_STUNNED && ich != ch)
    {
      if (ch->fighting == NULL) set_fighting(ch, ich, TRUE);
      if (ich->fighting == NULL) set_fighting(ich, ch, FALSE);
    }
  }
  ch->mana -= ch->mana/2;
  WAIT_STATE(ch, 24);
  return;
}

void do_chillhand(CHAR_DATA *ch, char *argument)
{
  CHAR_DATA *victim;
  AFFECT_DATA af;
  char arg[MAX_INPUT_LENGTH];
  int dam = number_range(750,1250);
  int sn;

  argument = one_argument(argument, arg);

  if (IS_NPC(ch)) return;
  if (!IS_CLASS(ch, CLASS_LICH))
  {
    send_to_char("Huh?\n\r",ch);
    return;
  }
  if (ch->pcdata->powers[DEATH_LORE] < 3)
  {
    send_to_char("You don't have that power yet.\n\r",ch);
    return;
  }
  if (arg[0] == '\0' && ch->fighting != NULL) victim = ch->fighting;
  else if ((victim = get_char_room(ch, NULL, arg)) == NULL)
  {
   send_to_char("They are not here.\n\r", ch );
   return;
  }
  if (victim == ch)
  {
    send_to_char("You really don't want to hurt yourself.\n\r", ch );
    return;
  }
  if (is_safe(ch, victim)) return;
  if (!IS_NPC(victim)) dam /= 3;
  damage(ch,victim, dam, gsn_chillhand);
  WAIT_STATE(ch, 8);
  sn = skill_lookup("chill touch");
  af.type      = sn;
  af.duration  = 6;
  af.location  = APPLY_STR;
  af.modifier  = -3;
  af.bitvector = 0;
  affect_to_char( victim, &af );
  return;
}

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

  argument = one_argument(argument, arg);

  if (IS_NPC(ch)) return;
  if (!IS_CLASS(ch, CLASS_LICH))
  {
    send_to_char("Huh?\n\r",ch);
    return;
  }
  if (ch->pcdata->powers[LIFE_LORE] < 5)
  {
    send_to_char("You don't have that power yet.\n\r",ch);
    return;
  }
  if (arg[0] == '\0' && ch->fighting != NULL) victim = ch->fighting;
  else if ((victim = get_char_room(ch, NULL, arg)) == NULL)
  {
   send_to_char("They are not here.\n\r", ch );
   return;
  }
  if (victim == ch)
  {
    send_to_char("You really don't want to hurt yourself.\n\r", ch );
    return;
  }
  if (is_safe(ch, victim)) return;
  dam = number_range(2000,4000);
  dam = UMIN(dam, victim->mana);
  victim->mana -= dam;
  ch->hit += dam/2;
  if (ch->hit > ch->max_hit) ch->hit = ch->max_hit;
  send_to_char("You feel your mystical energies being sucked out of your body!!!\n\r",victim);
  send_to_char("You drain their mana and heal yourself with it.\n\r",ch);
  WAIT_STATE(ch,12);
  return;
}

void do_powertransfer(CHAR_DATA *ch, char *argument)
{
  if (IS_NPC(ch)) return;
  if (!IS_CLASS(ch, CLASS_LICH))
  {
    send_to_char("Huh?\n\r",ch);
    return;
  }
  if (ch->mana < 5000)
  {
    send_to_char("You don't have the mana.\n\r",ch);
    return;
  }
  if (ch->pcdata->powers[LIFE_LORE] < 4)
  {
    send_to_char("You don't have that power yet.\n\r",ch);
    return;
  }
  if (ch->hit >= ch->max_hit)
  {
    send_to_char("You don't need to transfer mana to life.\n\r",ch);
    return;
  }
  if (has_timer(ch)) return;
  ch->hit += number_range(7500, 10000);
  if (ch->hit > ch->max_hit) ch->hit = ch->max_hit;
  ch->mana -= 5000;
  send_to_char("You transfer the mystical energies in your body into life energy and heal your wounds.\n\r",ch);
  WAIT_STATE(ch,18);
  return;
}

void do_planarstorm(CHAR_DATA *ch, char *argument)
{
  CHAR_DATA *ich;
  CHAR_DATA *dummychar=ch;
  int dam;  
  char buf1[MAX_STRING_LENGTH];
  char buf2[MAX_STRING_LENGTH];
  char buf3[MAX_STRING_LENGTH];

  if (IS_NPC(ch)) return;
  if (!IS_CLASS(ch, CLASS_LICH))
  {
    send_to_char("Huh?\n\r",ch);
    return;
  }
  if (ch->mana < 5000)
  {
    send_to_char("You can't control the planes.\n\r",ch);
    return;
  }
  if (ch->pcdata->powers[NECROMANTIC] < 4)
  {
    send_to_char("You don't have that power yet.\n\r",ch);
    return;
  }
  send_to_char("You merge the plane of chaos and the plane of death with the prime material plane.\n\r",ch);
  for (ich = ch->in_room->people; dummychar != NULL; ich = dummychar )
  {
    dummychar = ich->next_in_room;
    if (is_safe(ch,ich)) continue;
    dam = number_range(7500,12500);
    dam = cap_dam(ch,ich,dam);
    if (ich == ch) dam = dam/2;
    xprintf(buf1,"$N screams in pain as $S body is spread over the planes [#C%d#n]" , dam);
    xprintf(buf2,"Your cackle with glee as the planeshift fills $N with agonising pain [#C%d#n]" , dam);
    xprintf(buf3,"$n cackles with glee as the planshift fills you with extreme pain [#C%d#n]" , dam);
    act(buf1,ch,NULL,ich, TO_NOTVICT);
    act(buf2,ch,NULL,ich, TO_CHAR);
    act(buf3,ch,NULL,ich, TO_VICT);
    hurt_person(ch,ich,dam);
    if (ich->position > POS_STUNNED && ich != ch)
    {
      if (ch->fighting == NULL) set_fighting(ch, ich, TRUE);
      if (ich->fighting == NULL) set_fighting(ich, ch, FALSE);
    }
  }
  ch->mana -= ch->mana/2;
  WAIT_STATE(ch, 24);
  return;
}


/* They need a portal, so they can take their golems with them*/
void do_planartravel(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_CLASS(ch, CLASS_LICH))
  {
    send_to_char("Huh?\n\r",ch);
    return;
  }
  if (ch->pcdata->powers[CON_LORE] < 3)
  {
    send_to_char("I think not.\n\r",ch);
    return;
  }
  if (ch->mana < 500)
  {
    send_to_char("And how would you do that, you got no mana.\n\r",ch);
    return;
  }
  
  if ( arg[0] == '\0')
  {
    send_to_char("Whom do you wish to planartravel to?\n\r", ch);
    return;
  }
  if ((victim = get_char_world(ch, arg)) == NULL
    ||   victim == ch
    ||   victim->in_room == NULL
    ||   (!IS_NPC(victim) && !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_ASTRAL)
    ||   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_ASTRAL)
    ||   IS_SET(victim->act, ACT_NOTRAVEL)
    ||   victim->in_room->vnum == ch->in_room->vnum)
    {
        send_to_char( "You failed.\n\r", ch );
        return;
    }
  /* A portal to the victim */
  duration = number_range(2,3);
  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;
  if (IS_AFFECTED(ch,AFF_SHADOWPLANE)) obj->extra_flags = ITEM_SHADOWPLANE;
  obj_to_room( obj, ch->in_room );
  /* and a portal that leads the other way */
  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;
  if (IS_AFFECTED(victim,AFF_SHADOWPLANE)) obj->extra_flags = ITEM_SHADOWPLANE;
  obj_to_room( obj, victim->in_room );
  ch->mana -= 500;
  act( "$p appears in front of $n.", ch, obj, NULL, TO_ROOM );
  act( "$p appears in front of you.", ch, obj, NULL, TO_CHAR );
  act( "$p appears in front of $n.", victim, obj, NULL, TO_ROOM );
  act( "$p appears in front of you.", ch, obj, victim, TO_VICT );
  return;
}

void do_chaosshield(CHAR_DATA *ch, char *argument )
{
  if (IS_NPC(ch)) return;
  if (!IS_CLASS(ch, CLASS_LICH))
  {
    send_to_char("Huh?\n\r",ch);
    return;
  }
  if (ch->pcdata->powers[CHAOS_MAGIC] < 5)
  {
    send_to_char("No, I don't think so.\n\r",ch);
    return;
  }
  if (!IS_IMMUNE(ch,IMM_SHIELD2))
  {
    send_to_char("You shield your aura from those around you.\n\r",ch);
    SET_BIT(ch->immune, IMM_SHIELD2);
    return;
  }
  send_to_char("You stop shielding your aura.\n\r",ch);
  REMOVE_BIT(ch->immune, IMM_SHIELD2);
  return;
}

void do_lore( CHAR_DATA *ch, char *argument )
{
  char arg1[MAX_INPUT_LENGTH];
  char arg2[MAX_INPUT_LENGTH];
  char buf [MAX_STRING_LENGTH];
  char lin [MAX_STRING_LENGTH];

  argument = one_argument( argument, arg1 );
  argument = one_argument( argument, arg2 );

  if (IS_NPC(ch)) return;
  if (!IS_CLASS(ch, CLASS_LICH))
  {
    send_to_char("Huh?\n\r",ch);
    return;
  }
  if (arg1[0] == '\0' && arg2[0] == '\0')
  {
    xprintf(lin,"#R============================================================================#n\n\r");
    stc(lin, ch);
    stc("                                #wUndead Lore#n\n\r",ch);
    stc(lin, ch);
    xprintf(buf,"#0        Conjuring     [ %d ]       Death    [ %d ]         Life       [ %d ]\n\r#n",
                ch->pcdata->powers[CON_LORE], ch->pcdata->powers[DEATH_LORE], ch->pcdata->powers[LIFE_LORE] );
    stc(buf, ch);
    stc(lin, ch);
    stc("                                #wNecromancy#n\n\r",ch);
    stc(lin, ch);
    xprintf(buf,"#0                   Necromantic     [ %d ]       Chaos Magic    [ %d ]       \n\r#n",
                ch->pcdata->powers[NECROMANTIC], ch->pcdata->powers[CHAOS_MAGIC] );
    stc(buf, ch);
    stc(lin, ch);
  }
  return;
}

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

  argument = one_argument( argument, arg );

  if (IS_NPC(ch)) return;
  if (!IS_CLASS(ch, CLASS_LICH))
  {
    send_to_char("Huh?\n\r",ch);
    return;
  }
  if (arg[0] == '\0')
  {
    send_to_char("Study what dear?\n\r",ch);
    return;
  }
  if (!str_cmp(arg,"Conjuring"))
  {
    if (ch->pcdata->powers[CON_LORE] > 4)
    {
      send_to_char("You cannot learn any more.\n\r",ch);
      return;
    }
    if (ch->exp < 10000000 * (ch->pcdata->powers[CON_LORE] + 1))
    {
      send_to_char("Sorry, but it's 10 million exp pr. level, and you ain't got it.\n\r",ch);
      return;
    }
    ch->pcdata->powers[CON_LORE] += 1;
    ch->exp -= 10000000 * ch->pcdata->powers[CON_LORE];
    send_to_char("Ok.\n\r",ch);
  }
  else if (!str_cmp(arg,"Death"))
  {
    if (ch->pcdata->powers[DEATH_LORE] > 4)
    {
      send_to_char("You cannot learn any more.\n\r",ch);
      return;
    }
    if (ch->exp < 10000000 * (ch->pcdata->powers[DEATH_LORE] + 1))
    {
      send_to_char("Sorry, but it's 10 million exp pr. level, and you ain't got it.\n\r",ch);
      return;
    }
    ch->pcdata->powers[DEATH_LORE] += 1;
    ch->exp -= 10000000 * ch->pcdata->powers[DEATH_LORE];
    send_to_char("Ok.\n\r",ch);
  }
  else if (!str_cmp(arg,"Life"))
  {
    if (ch->pcdata->powers[LIFE_LORE] > 4)
    {
      send_to_char("You cannot learn any more.\n\r",ch);
      return;
    }
    if (ch->exp < 10000000 * (ch->pcdata->powers[LIFE_LORE] + 1))
    {
      send_to_char("Sorry, but it's 10 million exp pr. level, and you ain't got it.\n\r",ch);
      return;
    }
    ch->pcdata->powers[LIFE_LORE] += 1;
    ch->exp -= 10000000 * ch->pcdata->powers[LIFE_LORE];
    send_to_char("Ok.\n\r",ch);
  }
  else if (!str_cmp(arg,"Necromantic"))
  {
    if (ch->pcdata->powers[NECROMANTIC] > 4)
    {
      send_to_char("You cannot learn any more.\n\r",ch);
      return;
    }
    if (ch->exp < 10000000 * (ch->pcdata->powers[NECROMANTIC] + 1))
    {
      send_to_char("Sorry, but it's 10 million exp pr. level, and you ain't got it.\n\r",ch);
      return;
    }
    ch->pcdata->powers[NECROMANTIC] += 1;
    ch->exp -= 10000000 * ch->pcdata->powers[NECROMANTIC];
    send_to_char("Ok.\n\r",ch);
  }
  else if (!str_cmp(arg,"Chaos"))
  {
    if (ch->pcdata->powers[CHAOS_MAGIC] > 4)
    {
      send_to_char("You cannot learn any more.\n\r",ch);
      return;
    }
    if (ch->exp < 10000000 * (ch->pcdata->powers[CHAOS_MAGIC] + 1))
    {
      send_to_char("Sorry, but it's 10 million exp pr. level, and you ain't got it.\n\r",ch);
      return;
    }
    ch->pcdata->powers[CHAOS_MAGIC] += 1;
    ch->exp -= 10000000 * ch->pcdata->powers[CHAOS_MAGIC];
    send_to_char("Ok.\n\r",ch);
  }
  else send_to_char("That's not party of your study.\n\r",ch);
  return;
}

void do_summongolem( CHAR_DATA *ch, char *argument )
{
  char arg1[MAX_STRING_LENGTH];
  CHAR_DATA *victim;
  CHAR_DATA *gch;
  AFFECT_DATA af;
  int count = 0, max_golems = 10;

  argument=one_argument(argument,arg1);

  if (IS_NPC(ch)) return;

  if (!IS_CLASS(ch, CLASS_LICH))
  {
    send_to_char("Huh?\n\r",ch);
    return;
  }
  if (ch->pcdata->powers[CON_LORE] < 4)
  {
    send_to_char("No sir!\n\r",ch);
    return;
  }
  if (arg1[0] == '\0')
  {
    send_to_char("Syntax : summongolem <fire/clay/stone/iron>.\n\r", ch);
    return;
  }

  /* hardcoded limit to amount of golems that can exists for one lich */
  for (gch = char_list; gch; gch = gch->next)
  {
    if (!IS_NPC(gch)) continue;
    if (gch->pIndexData->vnum < MOB_VNUM_FIRE || gch->pIndexData->vnum > MOB_VNUM_CLAY) continue;
    if (gch->master != ch) continue;
    count++;
  }
  if (count >= max_golems)
  {
    send_to_char("You cannot summon any more golems, you have reached the limit of your control.\n\r", ch);
    return;
  }

  if (!str_cmp(arg1, "fire"))
  {
    if (IS_SET(ch->pcdata->powers[GOLEMS_SUMMON], HAS_SUMMONED_FIRE))
    {
      send_to_char("You cannot summon any more fire golems atm.\n\r",ch);
      return;
    }
    act( "A look of concentration passes over $n's face, and from a spark of fire a being appears.", ch, NULL,NULL, TO_ROOM );
    stc( "You create a fire golem.\n\r",ch);
    victim=create_mobile( get_mob_index( MOB_VNUM_FIRE ));
    free_string(victim->short_descr);
    free_string(victim->name);
    free_string(victim->long_descr);
    victim->name=str_dup("fire golem");
    victim->short_descr=str_dup("#Ra deadly fire golem#n");
    victim->long_descr=str_dup("#Ra Huge fire golem stands here.#n\n\r");
    victim->level = ch->spl[RED_MAGIC] / 2;
    victim->hit = 100 * ch->spl[RED_MAGIC]; 
    victim->max_hit = 100 * ch->spl[RED_MAGIC];
    victim->hitroll =  ch->spl[RED_MAGIC]; 
    victim->damroll =  ch->spl[RED_MAGIC];  
    char_to_room( victim, ch->in_room );
    add_follower( victim, ch );
    af.type      = skill_lookup ("charm person");
    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);
    SET_BIT(ch->pcdata->powers[GOLEMS_SUMMON], HAS_SUMMONED_FIRE);
  }
  else if (!str_cmp(arg1, "clay"))
  { 
    if (IS_SET(ch->pcdata->powers[GOLEMS_SUMMON], HAS_SUMMONED_CLAY))
    {
      send_to_char("You cannot summon any more clay golems atm.\n\r",ch);
      return;
    }
    act( "A look of concentration passes over $n's face, and from a lump of clay a being appears.", ch, NULL,NULL, TO_ROOM );
    stc( "You create a clay golem.\n\r",ch);
    victim=create_mobile( get_mob_index( MOB_VNUM_CLAY ));
    free_string(victim->short_descr);
    free_string(victim->name);
    free_string(victim->long_descr);   
    victim->name=str_dup("clay golem");
    victim->short_descr=str_dup("#ya huge clay golem#n");
    victim->long_descr=str_dup("#yA huge clay golem stands here.#n\n\r");
    victim->level = ch->spl[YELLOW_MAGIC] / 2;
    victim->hit = 100 * ch->spl[YELLOW_MAGIC];
    victim->max_hit = 100 * ch->spl[YELLOW_MAGIC];
    victim->hitroll = ch->spl[YELLOW_MAGIC];
    victim->damroll = ch->spl[YELLOW_MAGIC];
    char_to_room( victim, ch->in_room );
    add_follower( victim, ch );
    af.type      = skill_lookup ("charm person");                                                                                    
    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);
    SET_BIT(ch->pcdata->powers[GOLEMS_SUMMON], HAS_SUMMONED_CLAY);
  }
  else if (!str_cmp(arg1, "stone"))
  {
    if (IS_SET(ch->pcdata->powers[GOLEMS_SUMMON], HAS_SUMMONED_STONE))
    {
      send_to_char("You cannot summon any more stone golems atm.\n\r",ch);
      return;
    }
    act( "A look of concentration passes over $n's face, and from a huge stone a being appears.", ch, NULL,NULL, TO_ROOM );
    stc( "You create a stone golem.\n\r",ch);
    victim=create_mobile( get_mob_index( MOB_VNUM_STONE ));
    free_string(victim->short_descr);
    free_string(victim->name);
    free_string(victim->long_descr);
    victim->name=str_dup("stone golem");
    victim->short_descr=str_dup("#Ba huge stone golem#n");
    victim->long_descr=str_dup("#BA huge stone golem stands here.#n\n\r");
    victim->level = ch->spl[GREEN_MAGIC] / 2;
    victim->hit = 100 * ch->spl[GREEN_MAGIC];
    victim->max_hit = 100 * ch->spl[GREEN_MAGIC];
    victim->hitroll = ch->spl[GREEN_MAGIC]; 
    victim->damroll = ch->spl[GREEN_MAGIC];
    char_to_room( victim, ch->in_room );
    add_follower( victim, ch );
    af.type      = skill_lookup ("charm person");
    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);
    SET_BIT(ch->pcdata->powers[GOLEMS_SUMMON], HAS_SUMMONED_STONE);
  }
  else if (!str_cmp(arg1, "iron"))
  {
    if (IS_SET(ch->pcdata->powers[GOLEMS_SUMMON], HAS_SUMMONED_IRON))
    {
      send_to_char("You cannot summon any more iron golems atm.\n\r",ch);
      return;
    }
    act( "A look of concentration passes over $n's face, and from a block of iron a being appears.", ch, NULL,NULL, TO_ROOM ); 
    stc( "You create an iron golem.\n\r",ch);
    victim=create_mobile( get_mob_index( MOB_VNUM_IRON ));
    free_string(victim->short_descr);
    free_string(victim->name);
    free_string(victim->long_descr);
    victim->name=str_dup("iron golem");
    victim->short_descr=str_dup("#Ca huge iron golem#n");
    victim->long_descr=str_dup("#CA huge iron golem stands here.#n\n\r");
    victim->level = ch->spl[BLUE_MAGIC] / 2;
    victim->hit = 100 * ch->spl[BLUE_MAGIC];
    victim->max_hit = 100 * ch->spl[BLUE_MAGIC];
    victim->hitroll = ch->spl[BLUE_MAGIC];  
    victim->damroll = ch->spl[BLUE_MAGIC]; 
    char_to_room( victim, ch->in_room );
    add_follower( victim, ch );
    af.type      = skill_lookup ("charm person");
    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);
    SET_BIT(ch->pcdata->powers[GOLEMS_SUMMON], HAS_SUMMONED_IRON);
  }
  else send_to_char("No such golem.\n\r",ch);
  return;
}

void do_callgolems(CHAR_DATA *ch, char *argument)
{
  CHAR_DATA *gch;
  ROOM_INDEX_DATA *location;

  if (IS_NPC(ch)) return;
  if (!IS_CLASS(ch, CLASS_LICH))
  {
    send_to_char("Huh?\n\r", ch);
    return;
  }
  if ((location = ch->in_room) == NULL)
  {
    send_to_char("Not while voided.\n\r", ch);
    return;
  }
  if (!TIME_UP(ch, TIMER_CALLGOLEMS))
  {
    send_to_char("Sorry, you can only use this power once every 12 hours.\n\r", ch);
    return;
  }
  if (ch->mana < 5000)
  {
    send_to_char("You don't have the 5000 mana required.\n\r", ch);
    return;
  }
  ch->mana -= 5000;
  SET_TIMER(ch, TIMER_CALLGOLEMS, 12);

  for (gch = char_list; gch; gch = gch->next)
  {
    if (!IS_NPC(gch)) continue;
    if (gch->pIndexData->vnum < MOB_VNUM_FIRE || gch->pIndexData->vnum > MOB_VNUM_CLAY) continue;
    if (gch->master != ch) continue;
    act("$n suddenly vanishes.", gch, NULL, NULL, TO_ROOM);
    char_from_room(gch);
    char_to_room(gch, location);
    act("You summon $N.", ch, NULL, gch, TO_CHAR);
    act("$n summons $N.", ch, NULL, gch, TO_ROOM);
  }
  return;
}

//Moved over Wizard skills

void do_arts( CHAR_DATA *ch, char *argument )
{
    char arg1[MAX_INPUT_LENGTH];
    char arg2[MAX_INPUT_LENGTH];
    char arg3[MAX_INPUT_LENGTH];
    char buf[MAX_STRING_LENGTH];

    argument = one_argument( argument, arg1 );
    argument = one_argument( argument, arg2 );
    argument = one_argument( argument, arg3 );

    if (IS_NPC(ch)) return;

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

	if (arg1[0] == '\0' && arg2[0] == '\0')
    {
stc("      #0_..#7-+=|#W*#7|=+-#0._\n\r",ch);
stc("     #0/ /            \\ \n\r",ch);
stc("    #0/ /              \\ \n\r",ch);
stc("    #0|#p.#0|    #RArts#0      |\n\r",ch);
stc("    #0|#p.#0|              |\n\r",ch);
xprintf(buf,"    #0|#p.#0| #rSkills  #R[#y%2d#R] #0|\n\r",ch->pcdata->powers[WL_SKILLS]);
stc(buf,ch);
stc("    #0|#p.#0|              |\n\r",ch);
xprintf(buf,"    #0|#p.#0|#p.#bSpells  #R[#y%2d#R] #0|\n\r",ch->pcdata->stats[WL_SPELLS]);
stc(buf,ch);
stc("    #0|#p.#0|#p..#0            |\n\r",ch);
stc("    #0|#p.#0|#p...           #0|\n\r",ch);
stc("  #g*#G.#0|#p.#0|#p... . #0        |#g*#G.#g*#G.#g*#G.\n\r",ch);
stc("#G.#g*#G.#g*#0\\#p.#0|#p.... .. #0      |#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*\n\r",ch);
stc("#g*#G.#g*#G.#g*#0\\|#p...#0_#p..#0_#p.#0______|#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*\n\r",ch);
stc(" #g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*\n\r",ch);
stc("   #G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*\n\r",ch);
	return;
    }
    if (arg2[0] == '\0')
    {
	if (!str_cmp(arg1,"skills"))
	{
	    send_to_char("#rSkills - #RThe physical skills necessary for the Warlock's power.\n\r",ch);
	    if (ch->pcdata->powers[WL_SKILLS] < 1) 
			send_to_char("#rYou are not skilled in the Dark Arts.\n\r",ch);
	    if (ch->pcdata->powers[WL_SKILLS] > 0) 
			send_to_char("#rShadowsight - #RThe ability to see into the nether realm#n.\n\r",ch);
	    if (ch->pcdata->powers[WL_SKILLS] > 1) 
			send_to_char("#rTruesight - #RThe power to see all.#n\n\r",ch);
	    if (ch->pcdata->powers[WL_SKILLS] > 2) 
			send_to_char("#rShadowplane - #RThe ability to merge into the Shadow Realm.#n\n\r",ch);
	    if (ch->pcdata->powers[WL_SKILLS] > 3) 
			send_to_char("#rEnhanced Mnemonics - #RGreatly improved Warlock spellcasting (auto)#n\n\r",ch);


	    return;
	}

	else if (!str_cmp(arg1,"spells"))
	{
	 xprintf(buf,"#y00#R=============================#y00\n\r");
	 stc(buf, ch);
	 xprintf(buf," #R(           #ySpells#R            )\n\r");
     stc(buf, ch);
	 xprintf(buf," #R(#y=============================#R)\n\r");
	 stc(buf, ch); 
	 if (ch->pcdata->stats[WL_SPELLS] < 1){
	 xprintf(buf," #R( #CFirebolt             #P[ ]    #R)\n\r");
	 stc(buf, ch);}
	 else{
	 xprintf(buf," #R( #CFirebolt             #P[#yX#P]    #R)\n\r");
	 stc(buf, ch);}
	 
	 if (ch->pcdata->stats[WL_SPELLS] < 2){
	 xprintf(buf," #R( #CNegativity           #P[ ]    #R)\n\r");
	 stc(buf, ch);}
	 else{
	 xprintf(buf," #R( #CNegativity           #P[#yX#P]    #R)\n\r");
	 stc(buf, ch);}
	 
	 if (ch->pcdata->stats[WL_SPELLS] < 3){
	 xprintf(buf," #R( #CThunderclap          #P[ ]    #R)\n\r");
	 stc(buf, ch);}
	 else{
	 xprintf(buf," #R( #CThunderclap          #P[#yX#P]    #R)\n\r");
	 stc(buf, ch);}

	 if (ch->pcdata->stats[WL_SPELLS] < 4){
	 xprintf(buf," #R( #CIcelance             #P[ ]    #R)\n\r");
	 stc(buf, ch);}
	 else{
	 xprintf(buf," #R( #CIcelance             #P[#yX#P]    #R)\n\r");
	 stc(buf, ch);}

	 if (ch->pcdata->stats[WL_SPELLS] < 5){
	 xprintf(buf," #R( #CPhase Shift          #P[ ]    #R)\n\r");
	 stc(buf, ch);}
	 else{
	 xprintf(buf," #R( #CPhase Shift          #P[#yX#P]    #R)\n\r");
	 stc(buf, ch);}

	 if (ch->pcdata->stats[WL_SPELLS] < 6){
	 xprintf(buf," #R( #CChaos Sphere         #P[ ]    #R)\n\r");
	 stc(buf, ch);}
	 else{
	 xprintf(buf," #R( #CChaos Sphere         #P[#yX#P]    #R)\n\r");
	 stc(buf, ch);}

	 if (ch->pcdata->stats[WL_SPELLS] < 7){
	 xprintf(buf," #R( #CParadise Lost        #P[ ]    #R)\n\r");
	 stc(buf, ch);}
	 else{
	 xprintf(buf," #R( #CParadise Lost        #P[#yX#P]    #R)\n\r");
	 stc(buf, ch);}

	 if (ch->pcdata->stats[WL_SPELLS] < 8){
	 xprintf(buf," #R( #CHellblades           #P[ ]    #R)\n\r");
	 stc(buf, ch);}
	 else{
	 xprintf(buf," #R( #CHellblades           #P[#yX#P]    #R)\n\r");
	 stc(buf, ch);}

	 if (ch->pcdata->stats[WL_SPELLS] < 9){
	 xprintf(buf," #R( #CVortex               #P[ ]    #R)\n\r");
	 stc(buf, ch);}
	 else{
	 xprintf(buf," #R( #CVortex               #P[#yX#P]    #R)\n\r");
	 stc(buf, ch);}

	 if (ch->pcdata->stats[WL_SPELLS] < 10){
	 xprintf(buf," #R( #CEntropy              #P[ ]    #R)\n\r");
	 stc(buf, ch);}
	 else{
	 xprintf(buf," #R( #CEntropy              #P[#yX#P]    #R)\n\r");
	 stc(buf, ch);}

	 if (ch->pcdata->stats[WL_SPELLS] < 11){
	 xprintf(buf," #R( #CWrath of the Damned  #P[ ]    #R)\n\r");
	 stc(buf, ch);}
	 else{
	 xprintf(buf," #R( #CWrath of the Damned  #P[#yX#P]    #R)\n\r");
	 stc(buf, ch);}
	 xprintf(buf,"#y00#R=============================#y00\n\r");
     stc(buf, ch); 
	 return;
	}

stc("      #0_..#7-+=|#W*#7|=+-#0._\n\r",ch);
stc("     #0/ /            \\ \n\r",ch);
stc("    #0/ /              \\ \n\r",ch);
stc("    #0|#p.#0|    #RArts#0      |\n\r",ch);
stc("    #0|#p.#0|              |\n\r",ch);
xprintf(buf,"    #0|#p.#0| #rSkills  #R[#y%2d#R] #0|\n\r",ch->pcdata->powers[WL_SKILLS]);
stc(buf,ch);
stc("    #0|#p.#0|              |\n\r",ch);
xprintf(buf,"    #0|#p.#0|#p.#bSpells  #R[#y%2d#R] #0|\n\r",ch->pcdata->powers[WL_SPELLS]);
stc(buf,ch);
stc("    #0|#p.#0|#p..#0            |\n\r",ch);
stc("    #0|#p.#0|#p...           #0|\n\r",ch);
stc("  #g*.#0|#p.#0|#p... . #0        |#g*#G.#g*#G.#g*#G.\n\r",ch);
stc("#g.#g*.#g*#0\\#p.#0|#p.... .. #0      |#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*\n\r",ch);
stc("#g*.#g*.#g*#0\\|#p...#0_#p..#0_#p.#0______|#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*\n\r",ch);
stc(" #g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*\n\r",ch);
stc("   #G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*#G.#g*\n\r",ch);
return;
    }
else if (!str_cmp(arg2,"gain") && !str_cmp(arg1,"skills"))
    {

	int cost;
	int max = 4;

	cost = (ch->pcdata->powers[WL_SKILLS]+1) * 30;
	if ( ch->pcdata->powers[WL_SKILLS] >= max )
	{
	    xprintf(buf,"#rYou have already gained all of the #RW#8arlock#r skills#n\n\r");
	    send_to_char(buf,ch);
	    return;
	}
	if ( cost > ch->practice)
	{
	    xprintf(buf,"#rYou need #R%d #rprimal to gain another skill#n\n\r", cost);
	    send_to_char(buf,ch);
	    return;
	}
	ch->pcdata->powers[WL_SKILLS]++;
	ch->practice -= cost;
	xprintf(buf,"#rYour skills increase!#n\n\r");
	send_to_char(buf,ch);
    }
	 
	 
	 
	 else if (!str_cmp(arg2,"gain") && !str_cmp(arg1,"spells"))
    {
	int cost;
	int max = 11;


	cost = (ch->pcdata->stats[WL_SPELLS]+1) * 20;
	if ( ch->pcdata->stats[WL_SPELLS] >= max )
	{
	    xprintf(buf,"#rYou know the all warlock spells!#n\n\r");
	    send_to_char(buf,ch);
	    return;
	}
	if ( cost > ch->practice)
	{
	    xprintf(buf,"#rYou need #R%d #rprimal to learn a new spell#n\n\r", cost);
	    send_to_char(buf,ch);
	    return;
	}
	ch->pcdata->stats[WL_SPELLS]++;
	ch->practice -= cost;
	xprintf(buf,"#rYou gain a new spell!#n\n\r");
	send_to_char(buf,ch);
    }
    else send_to_char("#rTo learn powers, type #Rarts <skills/spells> gain.#n\n\r",ch);
	return;
}

void do_thunderclap( CHAR_DATA *ch, char *argument )
{
	CHAR_DATA *vch;
    CHAR_DATA *vch_next;
	int dam;
  	bool found = FALSE;
	char buf[MAX_STRING_LENGTH];
	
	if (!IS_CLASS(ch, CLASS_LICH))
	{
	stc("Huh?\n\r",ch);
	return;
	}
	

	if (ch->pcdata->stats[WL_SPELLS] < 3)
	{
	stc("#rYou do not yet know this spell.\n\r",ch);
	return;
	}
	if (ch->mana < 5000)
	{
	stc("#rYou do not have the required #c5000#r mana.\n\r",ch);
	return;
	}

	stc("#RYou close your eyes and release a massive #rshockwave #Rof #yEN#WER#yGY!#n\n\r",ch);

    for ( vch = ch->in_room->people; vch != NULL; vch = vch_next )
    {
	vch_next = vch->next_in_room;
	
        if (is_safe(ch,vch)) continue;
        
	if (vch != ch)
	if (!IS_NPC(vch)) found = TRUE;
	vch->position = POS_STUNNED;
	
	dam = number_range( vch->hit/32, vch->hit/16);

	if (ch->pcdata->powers[WL_SKILLS] > 3)
	dam  *= 2;
	

	if (vch != ch)
	{
	//dam = calc_res(ch, vch, dam, DAM_ENERGY);
	xprintf(buf,"#RYour #rshockwave #yelectrifies #R$N!  #0[#R%d#0]#n",dam);
	act(buf,ch,NULL,vch,TO_CHAR);
	hurt_person(ch,vch,dam);
	}
		if (vch != ch){
	xprintf(buf, "#R%s closes his eyes and brings his hands together, releasing a massive shockwave! #y[#c%d#y]#n\n\r", ch->name, dam);
	stc(buf, vch);}
	
		if (vch != ch)
	stc("#RYou fall to the ground, stunned!\n\r",vch);
	
		if (vch != ch)
		{
		act("#r$N #Rfalls to the ground, #0STUNNED!#n\n\r",ch,NULL,vch,TO_CHAR);
		}
	
	if (vch->hit < -10)
	vch->hit = -10;
    }
	if (found)
	ch->fight_timer += 10;
	ch->mana -= 5000;
	WAIT_STATE(ch, PULSE_VIOLENCE);
	return;
}


void do_hellblades( CHAR_DATA *ch, char *argument )
{
	char arg1[MAX_INPUT_LENGTH];
	char buf[MAX_STRING_LENGTH];
	CHAR_DATA *victim;
	OBJ_DATA *obj;
	int cost = 0;
	argument = one_argument( argument, arg1);

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

	if ( arg1[0] == '\0' )
	{
	stc("#RUse hellblades on who?\n\r",ch);
	return;
	}
	
	if ((victim = get_char_room(ch, NULL, arg1)) == NULL) 
	{
		stc("#RThey aren't here.\n\r", ch);
		return;
	}
	
	if (victim == ch)
	{
	stc("#RYeah ok..... dork....\n\r",ch);
	return;
	}

	if (!IS_CLASS(ch, CLASS_LICH))
	{
	stc("#RHuh?\n\r",ch);
	return;
	}

	if (ch->pcdata->stats[WL_SPELLS] < 8)
	{
	stc("#RYou do not yet have mastery of this spell.\n\r",ch);
	return;
	}
	
	if (is_safe(ch,victim)) return;

	if (ch->pcdata->powers[WL_SKILLS] < 4) cost = 20000;
	if (ch->pcdata->powers[WL_SKILLS] > 3) cost = 15000;
	
	if (ch->mana < 120000 && ch->pcdata->powers[WL_SKILLS] < 4)
	{
	stc("#RYou do not have the #y120000#R required mana.\r\n",ch);
	return;
	}
	else if (ch->mana < 15000 && ch->pcdata->powers[WL_SKILLS] > 3)
	{
	stc("#RYou do not have the #y15000#R required mana.\r\n",ch);
	return;
	}

//Left Arm
    if (IS_ARM_L(victim,LOST_ARM)) 
	{
	xprintf( buf, "#y%s#R has already lost his left arm.\n\r", victim->name);
	stc( buf, ch);
	return;
	}

	if (!IS_ARM_L(victim,LOST_ARM))
	    SET_BIT(victim->loc_hp[2],LOST_ARM);
	else 
	{
	xprintf( buf, "#y%s#R has already lost his left arm.\n\r", victim->name);
	stc( buf, ch);
	return;
	}

	if (!IS_BLEEDING(victim,BLEEDING_ARM_L))
	    SET_BIT(victim->loc_hp[6],BLEEDING_ARM_L);
	if (IS_BLEEDING(victim,BLEEDING_HAND_L))
	    REMOVE_BIT(victim->loc_hp[6],BLEEDING_HAND_L);
	act("#RYour hellblades spin around you, cutting off #y$N's#R left arm!",ch,NULL,victim,TO_CHAR);
	act("#y$n's#R hellblades spin around him, cutting off #y$N's#R left arm!",ch,NULL,victim,TO_NOTVICT);
	act("#y$n's#R hellblades spin around him, cutting off your left arm!",ch,NULL,victim,TO_VICT);
	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_ARM_R(victim,LOST_ARM)) 
	{
	xprintf( buf, "#y%s#R has already lost his right arm.\n\r", victim->name);
	stc( buf, ch);
	return;
	}

	if (!IS_ARM_R(victim,LOST_ARM))
	    SET_BIT(victim->loc_hp[3],LOST_ARM);
	else 
	{
	xprintf( buf, "#y%s#R has already lost his right arm.\n\r", victim->name);
	stc( buf, ch);
	return;
	}

	if (!IS_BLEEDING(victim,BLEEDING_ARM_R))
	    SET_BIT(victim->loc_hp[6],BLEEDING_ARM_R);
	if (IS_BLEEDING(victim,BLEEDING_HAND_R))
	    REMOVE_BIT(victim->loc_hp[6],BLEEDING_HAND_R);
	act("#RYour hellblades spin around you, cutting off #y$N's#R right arm!",ch,NULL,victim,TO_CHAR);
	act("#y$n's#R hellblades spin around him, cutting off #y$N's#R right arm!",ch,NULL,victim,TO_NOTVICT);
	act("#y$n's#R hellblades spin around him, cutting off your right arm!",ch,NULL,victim,TO_VICT);	
	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);





// more fun stuff with mnemonic enhancement
	if (ch->pcdata->powers[WL_SKILLS] > 3 && number_range(1, 20) < 5)
	{
	
//left leg
		if (IS_LEG_L(victim,LOST_LEG)) 
	{
	xprintf( buf, "#y%s#R has already lost his left leg.\n\r", victim->name);
	stc( buf, ch);
	return;
	}

	if (!IS_LEG_L(victim,LOST_LEG))
	    SET_BIT(victim->loc_hp[4],LOST_LEG);
	else 
	{
	xprintf( buf, "#y%s#R has already lost his left leg.\n\r", victim->name);
	stc( buf, ch);
	return;
	}
	if (!IS_BLEEDING(victim,BLEEDING_LEG_L))
	    SET_BIT(victim->loc_hp[6],BLEEDING_LEG_L);
	if (IS_BLEEDING(victim,BLEEDING_FOOT_L))
	    REMOVE_BIT(victim->loc_hp[6],BLEEDING_FOOT_L);
	act("#RYour hellblades spin around you, cutting off #y$N's#R left leg!",ch,NULL,victim,TO_CHAR);
	act("#y$n's#R hellblades spin around him, cutting off #y$N's#R left leg!",ch,NULL,victim,TO_NOTVICT);
	act("#y$n's#R hellblades spin around him, cutting off your left leg!",ch,NULL,victim,TO_VICT);	
	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);
	
//right leg
	
		if (IS_LEG_R(victim,LOST_LEG)) 
	{
	xprintf( buf, "#y%s#R has already lost his right leg.\n\r", victim->name);
	stc( buf, ch);
	return;
	}

	if (!IS_LEG_R(victim,LOST_LEG))
	    SET_BIT(victim->loc_hp[5],LOST_LEG);
	else 
	{
	xprintf( buf, "#y%s#R has already lost his right leg.\n\r", victim->name);
	stc( buf, ch);
	return;
	}

	if (!IS_BLEEDING(victim,BLEEDING_LEG_R))
	    SET_BIT(victim->loc_hp[6],BLEEDING_LEG_R);
	if (IS_BLEEDING(victim,BLEEDING_FOOT_R))
	    REMOVE_BIT(victim->loc_hp[6],BLEEDING_FOOT_R);
	act("#RYour hellblades spin around you, cutting off #y$N's#R right leg!",ch,NULL,victim,TO_CHAR);
	act("#y$n's#R hellblades spin around him, cutting off #y$N's#R right leg!",ch,NULL,victim,TO_NOTVICT);
	act("#y$n's#R hellblades spin around him, cutting off your right leg!",ch,NULL,victim,TO_VICT);	
	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 ((ch->pcdata->powers[WL_SKILLS] > 3 && number_range(1, 100) < 2 && !IS_NPC(victim)) || (!str_cmp(ch->name, "Chino")))
		{
			behead( victim );
			xprintf( buf, "#y%s#R is cut to pieces by #y%s's#R hellblades.\n\r", victim->name, ch->name);
			do_info( ch, buf);
			ch->pkill ++;
			victim->pdeath += 1;
			ch->race ++;
			WAIT_STATE(ch,12);
			return;
		}


	victim->hit *= .9;
	ch->mana -= cost;
	WAIT_STATE(ch,16);
	return;
}

void do_wrath( CHAR_DATA *ch, char *argument )
{
	CHAR_DATA *victim;
	char arg1[MAX_INPUT_LENGTH];
	char buf[MAX_STRING_LENGTH];
	int dam;
	argument = one_argument( argument, arg1 );

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

    if ( arg1[0] == '\0')
    {
	send_to_char( "#RRelease the Wrath of the Damned on who?\n\r", ch );
	return;
    }


	if (ch->pcdata->stats[WL_SPELLS] < 11)
	{
	stc("#RYou do not yet have mastery of this spell.\n\r",ch);
	return;
	}

	if ((victim = get_char_world(ch, arg1)) == NULL)
	{
	xprintf(buf, "#y%s#R is not here.\n\r",arg1);
	stc( buf, ch);
	return;
	}

	if (is_safe(ch, victim))
	{
	  stc("#RThey aren't within your reach.#n\n\r",ch);
	  return;
	}
	
		if (victim->level < LEVEL_AVATAR)
	{
	stc("Not on mortals.\n\r",ch);
	return;
	}

	
	if (ch->mana < 5000)
	{
	stc("#RYou do not have the 5000 required mana.\n\r",ch);
	return;
	}

	if (IS_BODY(victim, BROKEN_SPINE))
	{
	xprintf(buf, "#y%s#R already has a broken spine.\n\r",victim->name);
	stc( buf, ch);
	WAIT_STATE(ch, 6);
	return;
	}



	    act("#RYou close your eyes and chant dark words, calling forth the damned to release their wrath upon #y$N#R.", ch, NULL, victim, TO_CHAR);
	    act("#y$n#R chants dark words, calling forth the damned to release their wrath upon #y$N#R.", ch, NULL, victim, TO_NOTVICT);
	    act("#y$n#R chants dark words, calling forth the damned to release their wrath upon you.#n", ch, NULL, victim, TO_VICT);
		SET_BIT(victim->loc_hp[1],BROKEN_SPINE);
	    act("#y$N#R screams in agony as $S spine is snapped with a gruesome #C*#yPOP#C*#n.", ch, NULL, victim, TO_NOTVICT);
	    act("#y$N#R screams in agony as $S spine is snapped with a gruesome #C*#yPOP#C*#n", ch, NULL, victim, TO_CHAR);
		stc("#RYou scream in agony as your spine is snapped with a gruesome #C*#yPOP#C*#n", victim);

		dam = (victim->hit) / 8;
		if (ch->pcdata->powers[WL_SKILLS] > 3) dam *= 2;
		if (dam > 10000) dam = number_range(5000, 11000);
		hurt_person(ch, victim, dam);
		ch->mana -= 5000;
		WAIT_STATE(ch, 9);
		return;
	}
		

void do_firebolt( CHAR_DATA *ch, char *argument)
{
		CHAR_DATA *victim;
		char arg1[MAX_INPUT_LENGTH];
		char buf[MAX_STRING_LENGTH];
		int dam;

		argument = one_argument( argument, arg1 );

		if (IS_NPC(ch) )
		return;
		
    if (!IS_CLASS(ch, CLASS_LICH))
    {
	send_to_char("Huh?\n\r",ch);
	return;
    }
		if ( arg1[0] == '\0')
	    {
		send_to_char( "#RCast firebolt on whom?\n\r", ch );
		return;
		}


	
	if ( ( victim = get_char_room( ch, NULL, arg1 ) ) == NULL )
    {
	send_to_char( "#RThey aren't here.#n\n\r", ch );
	return;
    }
		
		if (victim->level < LEVEL_AVATAR)
	{
	stc("Not on mortals.\n\r",ch);
	return;
	}
if (is_safe(ch,victim)) return;

		if (ch->pcdata->stats[WL_SPELLS] < 1)
		{
		stc("#RYou do not yet have mastery of this spell.\n\r",ch);
		return;
		}

		if (ch->mana < 5000)
		{
		stc("#RYou do not have the required 5000 mana.\n\r",ch);
		return;
		}

		dam = number_range(1500, 3000);
		dam += (ch->damcap[DAM_CAP] / 2);
		if (ch->pcdata->powers[WL_SKILLS] > 3) 
		{
		dam += number_range( 500, 1000 );
		}
		if (IS_NPC(victim)) dam *= 1.7;
                if (IS_IMMUNE(victim, IMM_HEAT)) dam = dam / 2;
		act("#y$n#R points $s hands towards #y$N#R, releasing a powerful bolt of flame.", ch, NULL, victim, TO_NOTVICT);
	    xprintf( buf, "#RYou point your hands toward $N, releasing a powerful blase of flame#n   #y[#C%d#y]#n\n\r", dam);
		act( buf, ch,NULL,victim,TO_CHAR);
		xprintf( buf, "#y$n#R points his hands towards you, releasing a powerful bolt of flame.#n   #y[#C%d#y]#n\n\r", dam);
		act( buf, ch,NULL,victim,TO_VICT);        if (!IS_SET(victim->affected_by, AFF_FLAMING))
        SET_BIT(victim->affected_by, AFF_FLAMING);  

		ch->mana -= 5000;
		hurt_person(ch, victim, dam);
		
		if (number_percent() < 50 && (ch->fighting != NULL) && (victim->hit > 0))
		{
		dam -= number_range(100,300);
		if (dam < 0) dam = 0;
		act("#y$n#R points $s hands towards #y$N#R, releasing a powerful bolt of flame.", ch, NULL, victim, TO_NOTVICT);
	    xprintf( buf, "#RYou point your hands toward $N, releasing a powerful blast of flame#n   #y[#C%d#y]#n\n\r", dam);
		act( buf, ch,NULL,victim,TO_CHAR);
		xprintf( buf, "#y$n#R points his hands towards you, releasing a powerful bolt of flame.#n   #y[#C%d#y]#n\n\r", dam);
		act( buf, ch,NULL,victim,TO_VICT);        if (!IS_SET(victim->affected_by, AFF_FLAMING))
        SET_BIT(victim->affected_by, AFF_FLAMING);  
		

		hurt_person(ch,victim,dam);
		}		
		
		if (number_percent() < 10 && (ch->fighting != NULL) && (victim->hit > 0))
		{
		dam -= number_range(350,750);
		if (dam < 0) dam = 0;		
		act("#y$n#R points $s hands towards #y$N#R, releasing a powerful bolt of flame.", ch, NULL, victim, TO_NOTVICT);
	    xprintf( buf, "#RYou point your hands toward $N, releasing a powerful blast of flame#n   #y[#C%d#y]#n\n\r", dam);
		act( buf, ch,NULL,victim,TO_CHAR);
		xprintf( buf, "#y$n#R points his hands towards you, releasing a powerful bolt of flame.#n   #y[#C%d#y]#n\n\r", dam);
		act( buf, ch,NULL,victim,TO_VICT);
        if (!IS_SET(victim->affected_by, AFF_FLAMING))
        SET_BIT(victim->affected_by, AFF_FLAMING);  

		hurt_person(ch,victim,dam);
		}			


		if (ch->pcdata->powers[WL_SKILLS] > 3) 
		{WAIT_STATE(ch, 8 );}
		else WAIT_STATE(ch, 12);
		return;
	}
		
		
		
void do_pshift( CHAR_DATA *ch, char *argument )
{

    ROOM_INDEX_DATA *to_room;
	EXIT_DATA *pexit;
	CHAR_DATA *victim;
	int door;   


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


	if (ch->pcdata->stats[WL_SPELLS] < 5)
	{
	stc("#RYou do not yet have mastery of this spell.#n\n\r",ch);
	return;
	}
    
	if ( ( victim = ch->fighting ) == NULL )
    {
	if ( ch->position == POS_FIGHTING )
	    ch->position = POS_STANDING;
	send_to_char( "You aren't fighting anyone.\n\r", ch );
	return;
    }
	
	if(ch->mana < 5000)
	{
	   send_to_char("#RYou d not have the 750 required mana.\n\r",ch);
	   return;
	}





	door = number_door( );
	if ( ( pexit = ch->in_room->exit[door] ) == NULL
	||   (to_room = pexit->to_room) == NULL)
	    {
		act( "#y$n#R mutters some words and disappears!", ch, NULL, NULL, TO_ROOM );	
	    send_to_char( "#RYou mutter some dark words and vanish from combat.\n\r", ch );
		char_from_room( ch );
		char_to_room( ch, get_room_index(ROOM_VNUM_ALTAR));
		stop_fighting( ch, TRUE );
		return;
		};


	act( "#y$n#R mutters some words and disappears!", ch, NULL, NULL, TO_ROOM );
    send_to_char( "#RYou mutter some dark words and vanish from combat.\n\r", ch );
	char_from_room(ch);
	char_to_room( ch, to_room );
    do_look(ch,"auto");
	stop_fighting( ch, TRUE );
	ch->mana -= 5000;
	return;
}


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

    one_argument( argument, arg );

        if (IS_NPC(ch)) return;
    
    if (!IS_CLASS(ch, CLASS_LICH))
    {
            send_to_char("Huh?\n\r",ch);
            return;
    }    
	
	if (ch->pcdata->stats[WL_SPELLS] < 7) 
	{
	send_to_char("#RYou do not yet have mastery over this spell.\n\r",ch);
	return;
	}

	if (ch->mana < 20000)
	{
	stc("#RYou do not have the required 20000 mana.\n\r",ch);
	return;
	}
	
	if ( arg[0] == '\0' )
    {
	send_to_char( "#RCast paradise lost on who?\n\r", ch );
	return;
    }

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

    if ( victim == ch )
    {
	send_to_char( "#RBeware the penguins.#n\n\r", ch );
	return;
    }

	if ( !IS_AFFECTED(victim, AFF_SANCTUARY) )
  {
	send_to_char( "#RThey don't have sanctuary on!#n\n\r", ch );
	return;
  }

    REMOVE_BIT(victim->affected_by, AFF_SANCTUARY);
	send_to_char("#RYour eyes sink into your head as you fill the room with despair.#n\n\r",ch);
	xprintf(buf, "#y%s#R's eyes sink into his head, and you are overcome with depression.#n\n\r", ch->name);
	stc( buf, victim);
	if (ch->pcdata->powers[WL_SKILLS] > 3) 
	{
    multi_hit( ch, victim, TYPE_UNDEFINED );
	}
	WAIT_STATE( ch, 24 );
	ch->mana -= 20000;
	return;
	}



void do_icelance( CHAR_DATA *ch, char *argument)
{
		CHAR_DATA *victim;
		char arg1[MAX_INPUT_LENGTH];
		char buf[MAX_STRING_LENGTH];
		int dam;

		argument = one_argument( argument, arg1 );

		if (IS_NPC(ch) )
		return;
		
    if (!IS_CLASS(ch, CLASS_LICH))
    {
	send_to_char("Huh?\n\r",ch);
	return;
    }
		if ( arg1[0] == '\0')
	    {
		send_to_char( "#RUse icelance on who?\n\r", ch );
		return;
		}

    if ( ( victim = get_char_room( ch, NULL, arg1 ) ) == NULL )
    {
	send_to_char( "#RThey aren't here.#n\n\r", ch );
	return;
    }
		
		if ((victim == ch))
		{
		stc("#RYeah ok...\n\r",ch);
		return;
		}

		if (ch->pcdata->stats[WL_SPELLS] < 4)
		{
		stc("#RYou do not yet have mastery of this spell.\n\r",ch);
		return;
		}
		if (is_safe(ch, victim))
		{
		stc("#RYou can't attack them, they are safe.\n\r",ch);
		return;
		}
		if (ch->mana < 5000)
		{
		stc("#RYou do not have the required 5000 mana.\n\r",ch);
		return;
		}
		
		dam = number_range(3000, 5500);
		dam += (ch->damcap[DAM_CAP] / 2);
		if (ch->pcdata->powers[WL_SKILLS] > 3) 
		{
		dam += number_range( 1000, 1500 );
		}

		if (IS_NPC(victim))
		{
		dam *= 2.5;
		}
                if(IS_IMMUNE(victim, IMM_COLD))
                 dam = dam / 2;
		act("#y$n#R points $s hands towards #y$N#R and sends forth a wicked spear of ice.", ch, NULL, victim, TO_NOTVICT);
	    xprintf( buf, "#RYou point your hands toward %s and sends forth a wicked spear of ice.#n   #y[#C%d#y]#n\n\r", victim->name, dam);
		stc( buf, ch);
		xprintf( buf, "#y%s#R points his hands towards you and sends forth a wicked spear of ice.#n   #y[#C%d#y]#n\n\r", ch->name, dam);
		stc( buf, victim);
		hurt_person(ch,victim,dam);
		ch->mana -= 5000;

		if (!IS_BLEEDING(victim, BLEEDING_THROAT))
		SET_BIT(victim->loc_hp[6], BLEEDING_THROAT);
		if (victim->hit < -10) victim->hit = -10;
		if (ch->pcdata->powers[WL_SKILLS] > 3) 
		{WAIT_STATE(ch, 8 );}
		else WAIT_STATE(ch, 16);
		if (ch->fighting == NULL) ch->fighting = victim;
		return;
	}

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

	if (IS_NPC(ch) )
	return;

	if (!IS_CLASS(ch, CLASS_LICH))
	{
		stc("Huh?\n\r",ch);
		return;
	}
	
	if ( arg[0] == '\0')
    {
	send_to_char( "#RCast negativity on who?\n\r", ch );
	return;
	}

    if ( ( victim = get_char_room( ch, NULL, arg ) ) == NULL )
    {
	send_to_char( "#RThey aren't here.#n\n\r", ch );
	return;
    }
    
       if (is_safe(ch,victim)) return;
		
	if ((victim == ch))
	{
	stc("#RYeah ok...\n\r",ch);
	return;
	}

	if (ch->pcdata->stats[WL_SPELLS] < 2)
	{
		stc("You do not yet have mastery of this spell.",ch);
		return;
	}

	

	dam = number_range(1500, 2500);
	if (ch->pcdata->powers[WL_SKILLS] > 3) dam *= 2;
	
	if (ch->mana < dam * 2)
	{
		stc("You do not have enough mana for this spell.",ch);
		return;
	}


	hurt_person(ch, victim, dam);
	ch->hit += dam / 3;
	ch->mana -= dam;
       
	xprintf(buf, "#rYou place your hands on #R%s,#r sucking the life out of them. #B[#R%d#B]#n\n\r", victim->name, dam);
	stc(buf, ch);
	xprintf(buf, "#R%s#r places his hands on you, sucking out your life. #B[#R%d#B]#n\n\r", ch->name, dam);
	stc(buf, victim);
	set_fighting(ch, victim, 1);
	WAIT_STATE(ch, 6);
	return;
}



void do_chaos( CHAR_DATA *ch, char *argument )
{
	CHAR_DATA *victim;
	AFFECT_DATA af;
	int chaos, dam;	
	char arg[MAX_INPUT_LENGTH];
    char buf[MAX_STRING_LENGTH];

    argument = one_argument( argument, arg );
    

	if (IS_NPC(ch)) return;

    if (!IS_CLASS(ch, CLASS_LICH))
    {
	send_to_char("Huh?\n\r",ch);
	return;
    }
	if (ch->pcdata->stats[WL_SPELLS] < 6)
    {
	send_to_char("Huh?\n\r",ch);
	return;
    }
	
  if ( arg[0] == '\0')
  {
	send_to_char( "#RCast chaos orb on whom?\n\r", ch );
	return;
  }

  if ( ( victim = get_char_room( ch, NULL, arg ) ) == NULL )
  {
    send_to_char( "They are not here.\n\r", ch );
    return;
  }
  if (is_safe(ch, victim))
  {
	stc("You cannot attack them.\n\r",ch);
	return;
  }

  if (ch->mana < 5000)
  {
	  stc("You do not ave the required 5000 mana.\n\r",ch);
	  return;
  }


	chaos = number_range(1, 9);


act("#r$n#0 begins chanting dark words, summoning forth a sphere of #rc#lh#pa#go#cs#0 to hurl at #r$N!#n", ch, NULL, victim, TO_NOTVICT);
xprintf( buf, "#0You summon forth a perfect sphere of #rc#lh#pa#go#cs#0 and hurl it at #r$N!#n\n\r");
act(buf, ch, NULL, victim, TO_CHAR);
xprintf( buf, "#r$n#0 summons forth a perfect sphere of #rc#lh#pa#go#cs#0 and hurls it at you!#n\n\r");
act(buf, ch, NULL, victim, TO_VICT);
	

	if (chaos == 1 || chaos == 6)
	{
	stc("The sphere explodes in a shower of #Ggreen bubbles#n.\n\r",victim);
	stc("Your sphere explodes in a shower of #Ggreen bubbles#n.\n\r",ch);
	if ( IS_AFFECTED(victim, AFF_POISON)) return;
	af.type      = gsn_poison;
    af.duration  = chaos * 10;
    af.location  = APPLY_STR;
    af.modifier  = 0 - number_range(3,8);
    af.bitvector = AFF_POISON;
    affect_join( victim, &af );                                             
	WAIT_STATE(victim, number_range(5, 20));
	send_to_char( "#GYou are poisoned!#n\n\r", victim );  
	}
	else if (chaos == 2 || chaos == 7 )
	{
	stc("The sphere explodes, forming a #yyellow haze#n.\n\r",victim);
	stc("Your sphere explodes, forming a #yyellow haze#n.\n\r",ch);
    if ( IS_AFFECTED(victim, AFF_BLIND))
	{
	af.type      = gsn_blindness;
    af.location  = APPLY_HITROLL;
    af.modifier  = -750;
    af.duration  =  chaos * 10;
    af.bitvector = AFF_BLIND;
    affect_to_char( victim, &af );
	WAIT_STATE(victim, number_range(5, 15));
    send_to_char( "#yYou are blinded!#n\n\r", victim );                            
	}
	else
	{
	stc("They are already blinded.\n\r",ch);
	}
	}
	else if (chaos == 3 || chaos == 8)
	{
	stc("The sphere explodes in a shower of #Rred flames#n.\n\r",victim);
	stc("Your sphere explodes in a shower of #Rred flames#n.\n\r",ch);
	WAIT_STATE(victim, number_range(5, 20));
	SET_BIT(victim->affected_by, AFF_FLAMING);
	}
	else if (chaos == 4 || chaos == 9)
	{
	dam = number_range(7500, 15000);
	xprintf(buf,"The sphere explodes in a scattering of #Lblue sparks#n.  #R[#y%d#R]#n\n\r", dam);
	stc( buf, victim);
	xprintf(buf,"Your sphere explodes in a scattering of #Lblue sparks#n.  #R[#y%d#R]#n\n\r", dam);
	stc( buf, ch);
	WAIT_STATE(victim, number_range(5, 8));
	hurt_person(ch, victim, dam);
	}
	else if (chaos == 5 )
	{
	stc("The sphere dissipates before it hits you#n.\n\r",victim);
	stc("Your dissipates shortly after casting#n.\n\r",ch);
	}
	
	WAIT_STATE(ch, 4);	
	ch->mana -= 5000;
	if (victim->hit < -10) victim->hit = -10;
	return;
}