legend/
legend/area/
legend/player/
/***************************************************************************
 *  Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer,        *
 *  Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe.   *
 *                                                                         *
 *  Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael          *
 *  Chastain, Michael Quan, and Mitchell Tse.                              *
 *                                                                         *
 *  In order to use any part of this Merc Diku Mud, you must comply with   *
 *  both the original Diku license in 'license.doc' as well the Merc       *
 *  license in 'license.txt'.  In particular, you may not remove either of *
 *  these copyright notices.                                               *
 *                                                                         *
 *  Much time and thought has gone into this software and you are          *
 *  benefitting.  We hope that you share your changes too.  What goes      *
 *  around, comes around.                                                  *
 ***************************************************************************/
/***************************************************************************
 *  God Wars Mud copyright (C) 1994, 1995, 1996 by Richard Woolcock        *
 *  									   *
 *  Legend of Chrystancia copyright (C) 1999, 2000, 2001 by Matthew Little *
 *  This mud is NOT to be copied in whole or in part, or to be run without *
 *  the permission of Matthew Little. Nobody else has permission to        *
 *  authorise the use of this code.                                        *
 ***************************************************************************/
#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "merc.h"
#include "player.h"

/*
 * Local functions.
 */
NCLANS_DATA *nclans_table;
void do_darktendrils (CHAR_DATA * ch, char *argument)
{
   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_DROW)
       || !IS_SET (ch->pcdata->powers[1], DPOWER_DARKTENDRILS))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }

   if (IS_SET (ch->extra2, DROW_DARKTENDRILS))
   {
      send_to_char ("Your tendrils of darkness disappear.\n\r", ch);
      REMOVE_BIT (ch->extra2, DROW_DARKTENDRILS);
   }

   else
   {
      send_to_char ("You call forth dark tendrils to attack your foes.\n\r",
		    ch);
      SET_BIT (ch->extra2, DROW_DARKTENDRILS);
   }

   return;
}

void do_fightdance (CHAR_DATA * ch, char *argument)
{
   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_DROW)
       || !IS_SET (ch->pcdata->powers[1], DPOWER_FIGHTDANCE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }

   if (IS_SET (ch->extra2, DROW_FIGHTDANCE))
   {
      send_to_char ("You will no longer dance The Dance of Lloth.\n\r", ch);
      REMOVE_BIT (ch->extra2, DROW_FIGHTDANCE);
   }

   else
   {
      send_to_char
	 ("You will start dancing The Dance of Lloth while fighting.\n\r",
	  ch);
      SET_BIT (ch->extra2, DROW_FIGHTDANCE);
   }

   return;
}
void do_driderform (CHAR_DATA * ch, char *argument)
{
   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_DROW)
       || !IS_SET (ch->pcdata->powers[1], DPOWER_DRIDERFORM))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }

   if (!IS_POLYAFF (ch, POLY_SPIDERFORM))
   {
      send_to_char ("You can only Driderform while in spiderform.\n\r", ch);
      return;
   }

   if (IS_POLYAFF (ch, POLY_ZULO))
   {
      REMOVE_BIT (ch->polyaff, POLY_ZULO);
      REMOVE_BIT (ch->affected_by, AFF_POLYMORPH);
      act ("You transform back into spider form.", ch, NULL, NULL, TO_CHAR);
      act ("$n's shrinks back into spider form.", ch, NULL, NULL, TO_ROOM);
      free_string (ch->morph);
      ch->morph = str_dup ("");
      ch->pcdata->mod_str -= 15;
      ch->pcdata->mod_dex -= 15;

      if (IS_POLYAFF (ch, POLY_SPIDERFORM))
      {
	 SET_BIT (ch->affected_by, AFF_POLYMORPH);
	 sprintf (buf, "%s the giant myrlochar", ch->name);
	 free_string (ch->morph);
	 ch->morph = str_dup (buf);
      }
      return;
   }

   if (ch->stance[0] != -1)
      do_stance (ch, "");
   if (ch->mounted == IS_RIDING)
      do_dismount (ch, "");
   act ("You transform into large drider.", ch, NULL, NULL, TO_CHAR);
   act ("$n's body grows and distorts into a large drider.", ch, NULL, NULL,
	TO_ROOM);
   ch->pcdata->mod_str += 15;
   ch->pcdata->mod_dex += 15;
   SET_BIT (ch->polyaff, POLY_ZULO);
   SET_BIT (ch->affected_by, AFF_POLYMORPH);
   sprintf (buf, "%s the large drider", ch->name);
   free_string (ch->morph);
   ch->morph = str_dup (buf);
   return;
}


void do_skills (CHAR_DATA * ch, char *argument)
{
   char arg1[MAX_INPUT_LENGTH];
   char arg2[MAX_INPUT_LENGTH];
   char buf[MSL];

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


   if (IS_NPC (ch))
      return;
   
   if (!IS_CLASS (ch, CLASS_DROW))
   {
      do_rand_typo (ch);
      return;
   }

   if (arg1[0] == '\0' || arg2[0] == '\0')
   {
stc("-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n\r",ch);
sprintf(buf," Drowheal     [%3d] Divination [%3d] Earthshatter [%3d]\n\r",ch->powerd[0], ch->powerd[1], ch->powerd[2]);
stc(buf,ch);
sprintf(buf," Darkness     [%3d] Drowfire   [%3d] Garotte      [%3d]\n\r",ch->powerd[3],ch->powerd[4],ch->powerd[3]);
stc(buf,ch);
sprintf(buf," Dgarotte     [%3d] Web        [%3d] Confuse      [%3d]\n\r",ch->powerd[6],ch->powerd[7],ch->powerd[8]);
stc(buf,ch);
sprintf(buf," Glamour      [%3d] Shadowwalk [%3d] Chaosblast   [%3d]\n\r",ch->powerd[9],ch->powerd[10],ch->powerd[11]);
stc(buf,ch);
stc("-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n\r",ch);
stc(" Levitation   [XXX] Drowhate   [XXX] Spiderform   [XXX]\n\r",ch);
stc(" Drowshield   [XXX] Speed      [XXX] Drowsight    [XXX]\n\r",ch);
stc(" Spiderarms   [XXX] Drowpoison [XXX] Darktendrils [XXX]\n\r",ch);
stc(" Shadowbody   [XXX] Toughskin  [XXX]\n\r",ch);
stc("-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n\r",ch);
}
  return;
}

void do_grant (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   char arg1[MAX_INPUT_LENGTH];
   char arg2[MAX_INPUT_LENGTH];
   char buf[MAX_STRING_LENGTH];
   char cpyname[MAX_STRING_LENGTH];
   int inpart = 0;
   int cost = 0;

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

   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_DROW))
   {
      do_rand_typo (ch);
      return;
   }

   if (arg1[0] == '\0')
   {
      send_to_char ("Syntax: Grant <person> <power>\n\r", ch);
      send_to_char
         ("Drowfire     (2500),  Darkness    (7500),  Drowpoison    (2500).\n\r",
          ch);
      send_to_char
         ("Drowsight    (5000),  Drowshield  (5000),  Levitation    (1000).\n\r",
          ch);
      send_to_char
         ("Shadowwalk  (10000),  Garotte     (5000),  Spiderarms    (7500).\n\r",
          ch);
      send_to_char
         ("Drowhate    (10000),  Spiderform (15000),  Web           (5000).\n\r",
          ch);
      send_to_char
         ("Dgarotte     (2500),  Confuse     (2500),  Glamour       (5000).\n\r",
          ch);
      send_to_char
         ("Earthshatter (7500),  Speed       (7500),  Toughskin     (7500).\n\r",
          ch);
      send_to_char
         ("LlothsRegen (10000),  Driderform (25000),  Divination    (7500).\n\r",
          ch);
      send_to_char
         ("Shadowbody   (5000),  Fightdance (10000),  Darktendrils (25000).\n\r",
          ch);  
      send_to_char
         ("Chaosblast  (50000),  Heal       (50000)\n\r",ch);
      send_to_char
         ("Warrior         (0),  Mage           (0),  Cleric           (0).\n\r",
          ch);
      send_to_char 
         ("Assassin        (0)\n\r",ch);
      return;
   }

   if ((victim = get_char_world (ch, arg1)) == NULL)
   {
      send_to_char ("Nobody by that name.\n\r", ch);
      return;
   }

   if (IS_NPC (victim))
   {
      send_to_char ("Not on NPC's.\n\r", ch);
      return;
   }

   if (!str_cmp (arg2, "mage") || !str_cmp (arg2, "warrior")
       || !str_cmp (arg2, "cleric") || !str_cmp(arg2,"assassin"))
   {
      if (victim->pcdata->stats[UNI_GEN] < 3)
      {
	 send_to_char ("Not on them!\n\r", ch);
	 return;
      }

      if (!IS_CLASS (victim, CLASS_DROW))
      {
	 send_to_char ("Only on drows.\n\r", ch);
	 return;
      }

      if (IS_SET (victim->special, SPC_DROW_WAR)
	  || IS_SET (victim->special, SPC_DROW_MAG)
	  || IS_SET (victim->special, SPC_DROW_CLE)
          || IS_SET (victim->special, SPC_DROW_ASN))
      {
	 send_to_char ("They already have a profession.\n\r", ch);
	 return;
      }
      if (!str_cmp (arg2, "mage"))
	 SET_BIT (victim->special, SPC_DROW_MAG);
      else if (!str_cmp (arg2, "cleric"))
	 SET_BIT (victim->special, SPC_DROW_CLE);
      else if (!str_cmp (arg2, "warrior"))
	 SET_BIT (victim->special, SPC_DROW_WAR);
      else if (!str_cmp (arg2, "assassin"))
         SET_BIT (victim->special, SPC_DROW_ASN);
      send_to_char ("You give them a profession.\n\r", ch);
      send_to_char ("You have been given a profession.\n\r", victim);
      save_char_obj (victim);
      return;
   }
/*
   if (!str_cmp (arg2, "noble"))
   {
      if (victim == ch)
      {
	 send_to_char ("Not on yourself!\n\r", ch);
	 return;
      }
      if (str_cmp (ch->clan, victim->clan))
      {
	 stc ("They are not of your clan!\n\r", ch);
	 return;
      }
      if (ch->pcdata->stats[UNI_GEN] > 2)
      {
	 send_to_char ("Only the leader the power to make princes.\n\r", ch);
	 return;
      }
      if (IS_SET (victim->special, SPC_PRINCE))
      {
	 send_to_char ("You have lost your noblehood!\n\r", victim);
	 send_to_char ("You remove their noblehood.\n\r", ch);
	 REMOVE_BIT (victim->special, SPC_PRINCE);
      }
      else
      {
	 send_to_char ("You have been made a noble!\n\r", victim);
	 send_to_char ("You make them a noble.\n\r", ch);
	 SET_BIT (victim->special, SPC_PRINCE);
      }
      do_autosave (victim, "");
      return;
   }*/

   if (!str_cmp (arg2, "drowfire"))
   {
      inpart = DPOWER_DROWFIRE;
      cost = 2500;
      sprintf(cpyname,"Drow Fire");
   }
   else if (!str_cmp (arg2, "darktendrils"))
   {
      inpart = DPOWER_DARKTENDRILS;
      cost = 25000;
      sprintf(cpyname,"Dark Tendrils");
   }
   else if (!str_cmp(arg2,"chaosblast"))
   {
      inpart = DPOWER_CHAOSBLAST;
      cost = 50000;
      sprintf(cpyname,"Chaos Blast");
   }
   else if (!str_cmp(arg2,"heal"))
   {   
      inpart = DPOWER_DROWHEAL;
      cost = 50000;
      sprintf(cpyname,"Drow Heal");
   }   
   else if (!str_cmp (arg2, "fightdance"))
   {
      inpart = DPOWER_FIGHTDANCE;
      cost = 10000;
      sprintf(cpyname,"Fight Dance");
   }
   else if (!str_cmp (arg2, "driderform"))
   {
      inpart = DPOWER_DRIDERFORM;
      cost = 25000;
      sprintf(cpyname,"Drider Form");
   }
   else if (!str_cmp (arg2, "shadowbody"))
   {
      inpart = DPOWER_SHADOWBODY;
      cost = 5000;
      sprintf(cpyname,"Shadow Body");
   }
   else if (!str_cmp (arg2, "divination"))
   {
      inpart = DPOWER_DROWSCRY;
      cost = 7500;
      sprintf(cpyname,"Divination");
   }
   else if (!str_cmp (arg2, "llothsregen"))
   {
      inpart = DPOWER_REGEN;
      cost = 10000;
      sprintf(cpyname,"Lloths Regen");
   }
   else if (!str_cmp (arg2, "darkness"))
   {
      inpart = DPOWER_DARKNESS;
      cost = 7500;
      sprintf(cpyname,"Darkness");
   }
   else if (!str_cmp (arg2, "drowsight"))
   {
      inpart = DPOWER_DROWSIGHT;
      cost = 5000;
      sprintf(cpyname,"Drowsight");
   }
   else if (!str_cmp (arg2, "spiderarms"))
   {
      inpart = DPOWER_ARMS;
      cost = 7500;
      sprintf(cpyname,"Spider Arms");
   }
   else if (!str_cmp (arg2, "web"))
   {
      inpart = DPOWER_WEB;
      cost = 5000;
      sprintf(cpyname,"Web");
   }
   else if (!str_cmp (arg2, "spiderform"))
   {
      inpart = DPOWER_SPIDERFORM;
      cost = 15000;
      sprintf(cpyname,"Spiderform");
   }
   else if (!str_cmp (arg2, "drowhate"))
   {
      inpart = DPOWER_DROWHATE;
      cost = 10000;
      sprintf(cpyname,"Drow Hate");
   }
   else if (!str_cmp (arg2, "drowshield"))
   {
      inpart = DPOWER_DROWSHIELD;
      cost = 5000;
      sprintf(cpyname,"Drow Shield");
   }
   else if (!str_cmp (arg2, "levitation"))
   {
      inpart = DPOWER_LEVITATION;
      cost = 1000;
      sprintf(cpyname,"Levitation");
   }
   else if (!str_cmp (arg2, "shadowwalk"))
   {
      inpart = DPOWER_SHADOWWALK;
      cost = 10000;
      sprintf(cpyname,"Shadow Walk");
   }
   else if (!str_cmp (arg2, "garotte"))
   {
      inpart = DPOWER_GAROTTE;
      cost = 5000;
      sprintf(cpyname,"Garotte");
   }
   else if (!str_cmp (arg2, "dgarotte"))
   {
      inpart = DPOWER_DGAROTTE;
      cost = 2500;
      sprintf(cpyname,"Dark Garotte");
   }
   else if (!str_cmp (arg2, "drowpoison"))
   {
      inpart = DPOWER_DROWPOISON;
      cost = 2500;
      sprintf(cpyname,"Drow Poison");
   }
   else if (!str_cmp (arg2, "glamour"))
   {
      inpart = DPOWER_GLAMOUR;
      cost = 5000;
      sprintf(cpyname,"Glamour");
   }
   else if (!str_cmp (arg2, "confuse"))
   {
      inpart = DPOWER_CONFUSE;
      cost = 2500;
      sprintf(cpyname,"Confuse");
   }
   else if (!str_cmp (arg2, "earthshatter"))
   {
      inpart = DPOWER_EARTHSHATTER;
      cost = 7500;
      sprintf(cpyname,"Earthshatter");
   }
   else if (!str_cmp (arg2, "speed"))
   {
      inpart = DPOWER_SPEED;
      cost = 7500;
      sprintf(cpyname,"Speed");
   }
   else if (!str_cmp (arg2, "toughskin"))
   {
      inpart = DPOWER_TOUGHSKIN;
      cost = 7500;
      sprintf(cpyname,"Toughskin");
   }
   else
   {
      send_to_char ("Syntax: Grant <person> <power>\n\r", ch);
      sprintf( buf, 
         "%sDrowfire     (2500),  %sDarkness    (7500),  %sDrowpoison    (2500).\n\r",
         IS_SET (victim->pcdata->powers[1], DPOWER_DROWFIRE) ? "#0" : "#w",
         IS_SET (victim->pcdata->powers[1], DPOWER_DARKNESS) ? "#0" : "#w",
         IS_SET (victim->pcdata->powers[1], DPOWER_DROWPOISON) ? "#0" : "#w");
      send_to_char( buf, ch );
      sprintf( buf, 
         "%sDrowsight    (5000),  %sDrowshield  (5000),  %sLevitation    (1000).\n\r",
         IS_SET (victim->pcdata->powers[1], DPOWER_DROWSIGHT) ? "#0" : "#w",
         IS_SET (victim->pcdata->powers[1], DPOWER_DROWSHIELD) ? "#0" : "#w",
         IS_SET (victim->pcdata->powers[1], DPOWER_LEVITATION) ? "#0" : "#w");
      send_to_char( buf, ch );
      sprintf( buf, 
         "%sShadowwalk  (10000),  %sGarotte     (5000),  %sSpiderarms    (7500).\n\r",
         IS_SET (victim->pcdata->powers[1], DPOWER_SHADOWWALK) ? "#0" : "#w",
         IS_SET (victim->pcdata->powers[1], DPOWER_GAROTTE) ? "#0" : "#w",
         IS_SET (victim->pcdata->powers[1], DPOWER_ARMS) ? "#0" : "#w");
      send_to_char( buf, ch );
      sprintf( buf, 
         "%sDrowhate    (10000),  %sSpiderform (15000),  %sWeb           (5000).\n\r",
         IS_SET (victim->pcdata->powers[1], DPOWER_DROWHATE) ? "#0" : "#w",
         IS_SET (victim->pcdata->powers[1], DPOWER_SPIDERFORM) ? "#0" : "#w",
         IS_SET (victim->pcdata->powers[1], DPOWER_WEB) ? "#0" : "#w");
      send_to_char( buf, ch );
      sprintf( buf, 
         "%sDgarotte     (2500),  %sConfuse     (2500),  %sGlamour       (5000).\n\r",
         IS_SET (victim->pcdata->powers[1], DPOWER_DGAROTTE) ? "#0" : "#w",
         IS_SET (victim->pcdata->powers[1], DPOWER_CONFUSE) ? "#0" : "#w",
         IS_SET (victim->pcdata->powers[1], DPOWER_GLAMOUR) ? "#0" : "#w");
      send_to_char( buf, ch );
      sprintf( buf, 
         "%sEarthshatter (7500),  %sSpeed       (7500),  %sToughskin     (7500).\n\r",
         IS_SET (victim->pcdata->powers[1], DPOWER_EARTHSHATTER) ? "#0" : "#w",
         IS_SET (victim->pcdata->powers[1], DPOWER_SPEED) ? "#0" : "#w",
         IS_SET (victim->pcdata->powers[1], DPOWER_TOUGHSKIN) ? "#0" : "#w");
      send_to_char( buf, ch );
      sprintf( buf, 
         "%sLlothsRegen (10000),  %sDriderform (25000),  %sDivination    (7500).\n\r",
         IS_SET (victim->pcdata->powers[1], DPOWER_REGEN) ? "#0" : "#w",
         IS_SET (victim->pcdata->powers[1], DPOWER_DRIDERFORM) ? "#0" : "#w",
         IS_SET (victim->pcdata->powers[1], DPOWER_DROWSCRY) ? "#0" : "#w");
      send_to_char( buf, ch );
      sprintf( buf, 
         "%sShadowbody   (5000),  %sFightdance (10000),  %sDarktendrils (25000).\n\r",
         IS_SET (victim->pcdata->powers[1], DPOWER_SHADOWBODY) ? "#0" : "#w",
         IS_SET (victim->pcdata->powers[1], DPOWER_FIGHTDANCE) ? "#0" : "#w",
         IS_SET (victim->pcdata->powers[1], DPOWER_DARKTENDRILS) ? "#0" : "#w");
      send_to_char( buf, ch );
      sprintf( buf, 
         "%sChaosblast  (50000),  %sHeal       (50000)\n\r",
         IS_SET (victim->pcdata->powers[1], DPOWER_CHAOSBLAST) ? "#0" : "#w",
         IS_SET (victim->pcdata->powers[1], DPOWER_DROWHEAL) ? "#0" : "#w");
      send_to_char( buf, ch );
      sprintf( buf, 
         "%sWarrior         (0),  %sMage           (0),  %sCleric           (0).\n\r",
         IS_SET (victim->special, SPC_DROW_WAR) ? "#0" : "#w",
         IS_SET (victim->special, SPC_DROW_MAG) ? "#0" : "#w",
         IS_SET (victim->special, SPC_DROW_CLE) ? "#0" : "#w");
      send_to_char( buf, ch );
      sprintf( buf, 
         "%sAssassin        (0)\n\r",
         IS_SET (victim->special, SPC_DROW_ASN) ? "#0" : "#w");
      send_to_char( buf, ch );
      return;
   }
   if (IS_SET (victim->pcdata->powers[1], inpart))
   {
      send_to_char ("They have already got that power.\n\r", ch);
      return;
   }
   if (ch->pcdata->stats[DROW_POWER] < cost)
   {
      send_to_char ("You have insufficient power to grant that gift.\n\r",
		    ch);
      return;
   }
   SET_BIT (victim->pcdata->powers[1], inpart);
   ch->pcdata->stats[DROW_POWER] -= cost;
//   if (victim != ch)
//      send_to_char ("You have been granted a gift from your matron!\n\r",
//		    victim);
   if (victim != ch) {
   sprintf(buf,"You have been granted %s by %s\n\r",cpyname,ch->name);
   send_to_char(buf,victim); }
   send_to_char ("Ok.\n\r", ch);
   if (victim != ch)
      save_char_obj (ch);
   save_char_obj (victim);
   return;
}

void do_ddarkness (CHAR_DATA * ch, char *argument)
{
   char buf[MAX_STRING_LENGTH];
   ROOM_INDEX_DATA *inroom;

   inroom = ch->in_room;

   if (IS_NPC (ch))
      return;
   if (!IS_CLASS (ch, CLASS_VAMPIRE))
   {
      do_rand_typo (ch);
      return;
   }
   if (ch->pcdata->condition[COND_THIRST] < 300)
   {
      send_to_char ("You have insufficient blood.\n\r", ch);
      return;
   }
   ch->pcdata->condition[COND_THIRST] -= 300;
   SET_BIT (inroom->room_flags, ROOM_DARK);
   sprintf (buf, "A look of concentration passes over %s's face.", ch->name);
   act (buf, ch, NULL, NULL, TO_ROOM);
   send_to_char ("A look of concentration passes over your face.\n\r", ch);
   sprintf (buf, "A complete darkness fills the room.\n\r");
   act (buf, ch, NULL, NULL, TO_ROOM);
   send_to_char (buf, ch);
   return;
}

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

   CHAR_DATA *victim;
   char arg[MAX_INPUT_LENGTH];
   int sn;
   int mcost;
   int level;
   int spelltype;

   argument = one_argument (argument, arg);
   if (IS_NPC (ch))
      return;

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


/*
   if (!IS_CLASS (ch, CLASS_DROW)
       || (!IS_SET (ch->special, SPC_DROW_MAG)
	   && ch->pcdata->stats[UNI_GEN] > 2))
   {
      do_rand_typo (ch);
      return;
   }*/

   if (!IS_CLASS (ch, CLASS_DROW)
       || !IS_SET (ch->pcdata->powers[1], DPOWER_CHAOSBLAST))
   {
      do_rand_typo (ch);
      return;
   }

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

   if (IS_SET (ch->special, SPC_DROW_MAG)) mcost = number_range(1500,2500);
   else mcost = 1000;

   if (ch->mana < mcost)
   {
      send_to_char ("You don't have enough mana.\n\r", ch);
      return;
   }

   if (!IS_NPC (victim))
   {
      if (IS_DEMPOWER (victim, HPOWER_USE_PRESERVATION))
      {
	 int rand_drain = number_range (15, 25);

	 if (victim->quickening[0] >= rand_drain)
	 {
	    victim->quickening[0] -= rand_drain;
	    stc ("Sparkles of energy negate the chaos bolt before it impacts.\n\r", ch);
	    stc ("Sparkles of energy negate the chaos bolt before it impacts.\n\r", victim);
	    ch->fight_timer = 10;
	    victim->fight_timer = 10;
	    return;
	 }
      }
   }


   if (WORN_ARTIFACT (victim, ARTI_CHAOS_AXE))
   {
        send_to_char("The Chaos Axe prevents your chaos blast!\n\r",ch);
        send_to_char("Your Chaos Axe protects you from the chaos blast!\n\r",victim);
        ch->mana -= mcost;
        ch->fight_timer = 10;
        victim->fight_timer = 10;
        WAIT_STATE (ch, 12);
        return;
   }

  if (!IS_SET (ch->special, SPC_DROW_MAG)) 
  {

   if ((sn = skill_lookup ("chaos blast")) < 0)
      return;
   spelltype = skill_table[sn].target;
     level = ch->spl[spelltype] * 5;
   act ("You concentrate your power on $N.", ch, NULL, victim, TO_CHAR);
   act ("$n concentrates $s power on you.", ch, NULL, victim, TO_VICT);
   (*skill_table[sn].spell_fun) (sn, level, ch, victim);
   }
 else
   {
        if ((sn = skill_lookup ("chaos blast")) < 0)
            return;

          spelltype = skill_table[sn].target;
          level = ch->spl[spelltype] * 5;
          act ("You concentrate your power on $N.", ch, NULL, victim, TO_CHAR);
          act ("$n concentrates $s power on you.", ch, NULL, victim, TO_VICT);
          (*skill_table[sn].spell_fun) (sn, level, ch, victim);

           if (number_range(1,2) == 1)
           {
              stc("#rYour chaos blast continues!#n\n\r",ch);
              (*skill_table[sn].spell_fun) (sn, level, ch, victim);
           }

           if (number_range(1,2) == 1)
           {
              stc("#gYour chaos blast continues!#n\n\r",ch);
              (*skill_table[sn].spell_fun) (sn, level, ch, victim);
           }

           if (number_range(1,2) == 1)
           {
              stc("#pYour chaos blast continues!#n\n\r",ch);
              (*skill_table[sn].spell_fun) (sn, level, ch, victim);
           }
   }
   WAIT_STATE (ch, 12);
   ch->mana -= mcost;
   return;
}

void do_drowcreate (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_DROW))
   {
      do_rand_typo (ch);
      return;
   }

   if (arg[0] == '\0')
   {
      send_to_char
	 ("Please specify what kind of equipment you want to create.\n\r",
	  ch);
      send_to_char ("Whip, Dagger, Ring, Amulet, Armor, Helmet,\n\r", ch);
      send_to_char ("Leggings, Boots, Gauntlets, Sleeves,\n\r", ch);
      send_to_char ("Belt, Bracer, Mask, Cloak.\n\r", ch);
      return;
   }
   if (!str_cmp (arg, "whip"))
      vnum = 29600;
   else if (!str_cmp (arg, "cloak"))
      vnum = 29613;
   else if (!str_cmp (arg, "armor"))
      vnum = 29604;
   else if (!str_cmp (arg, "boots"))
      vnum = 29607;
   else if (!str_cmp (arg, "gauntlets"))
      vnum = 29608;
   else if (!str_cmp (arg, "sleeves"))
      vnum = 29609;
   else if (!str_cmp (arg, "belt"))
      vnum = 29610;
   else if (!str_cmp (arg, "helmet"))
      vnum = 29605;
   else if (!str_cmp (arg, "leggings"))
      vnum = 29606;
   else if (!str_cmp (arg, "mask"))
      vnum = 29612;
   else if (!str_cmp (arg, "bracer"))
      vnum = 29611;
   else if (!str_cmp (arg, "dagger"))
      vnum = 29601;
   else if (!str_cmp (arg, "ring"))
      vnum = 29602;
   else if (!str_cmp (arg, "amulet"))
      vnum = 29603;

   else
   {
      send_to_char ("That is an invalid type.\n\r", ch);
      return;
   }
   if (ch->pcdata->stats[DROW_POWER] < 10000)
   {
      send_to_char
	 ("It costs 10000 points of power to create a piece of drow armour.\n\r",
	  ch);
      return;
   }
   if (vnum == 0 || (pObjIndex = get_obj_index (vnum)) == NULL)
   {
      send_to_char ("Missing object, please inform KaVir.\n\r", ch);
      return;
   }
   ch->pcdata->stats[DROW_POWER] -= 10000;
   obj = create_object (pObjIndex, 50);
   obj_to_char (obj, ch);
   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_llothsfavor (CHAR_DATA * ch, char *argument)
{
   char buf[MAX_INPUT_LENGTH];
   CHAR_DATA *victim;
   char arg[MAX_INPUT_LENGTH];
   bool can_sire = FALSE;

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_DROW))
   {
      do_rand_typo (ch);
      return;
   }
   if (IS_SET (ch->special, SPC_PRINCE))
      can_sire = TRUE;
   if (ch->pcdata->stats[UNI_GEN] < 3)
      can_sire = TRUE;

   if (!can_sire)
   {
      send_to_char ("You are not able to create any more drow.\n\r", ch);
      return;
   }
   if (arg[0] == '\0')
   {
      send_to_char ("Give Lloth's favor to whom?\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->max_hit < 3000)
   {
      stc ("You need 3000hps before you can be classed\n\r", victim);
      stc ("They need 3000hps before they can be classed\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_MAGE))
   {
      send_to_char ("Not on a mage.\n\r", ch);
      return;
   }

   if (victim->level != LEVEL_AVATAR && !IS_IMMORTAL (victim))
   {
      send_to_char ("Only on avatars.\n\r", ch);
      return;
   }

   if (!IS_IMMUNE (victim, IMM_DEMON))
   {
      send_to_char ("Not on an unwilling person.\n\r", ch);
      return;
   }
   if (IS_CLASS (victim, CLASS_DROW))
   {
      send_to_char ("They are already a drow.\n\r", ch);
      return;
   }
/*
	 if (IS_CLASS(victim, CLASS_DROW))
{
        victim->clan=str_dup(ch->clan);
        return;
  }
*/
   if (IS_CLASS (victim, CLASS_DEMON)
       || IS_SET (victim->special, SPC_CHAMPION))
   {
      send_to_char ("Not on a demon!\n\r", ch);
      return;
   }

   if (IS_CLASS (victim, CLASS_VAMPIRE))
   {
      send_to_char ("Not on a vampire!\n\r", ch);
      return;
   }

   if (IS_CLASS (victim, CLASS_WEREWOLF))
   {
      send_to_char ("Not on a werewolf!\n\r", ch);
      return;
   }
   if (IS_CLASS (victim, CLASS_HIGHLANDER))
   {
      send_to_char ("Not on a highlander.\n\r", ch);
      return;
   }

   if (IS_CLASS (victim, CLASS_MONK))
   {
      send_to_char ("Not on monks!\n\r", ch);
      return;
   }
   if (IS_CLASS (victim, CLASS_NINJA))
   {
      send_to_char ("Not on a ninja.\n\r", ch);
      return;
   }

   if (ch->exp < 10000)
   {
      send_to_char ("You cannot afford the 10,000 exp.\n\r", ch);
      return;
   }

   ch->exp = ch->exp - 10000;
   act ("You make $N a drow!", ch, NULL, victim, TO_CHAR);
   act ("$n makes $N a drow!", ch, NULL, victim, TO_NOTVICT);
   act ("$n makes you a drow!", ch, NULL, victim, TO_VICT);
   victim->class = 0;
   victim->class = CLASS_DROW;
   victim->special = 0;

   if (IS_CLASS (victim, CLASS_VAMPIRE))
      do_mortalvamp (victim, "");
   REMOVE_BIT (victim->act, PLR_HOLYLIGHT);
   REMOVE_BIT (victim->act, PLR_WIZINVIS);
   REMOVE_BIT (victim->special, SPC_SIRE);
   REMOVE_BIT (victim->special, SPC_ANARCH);
   victim->pcdata->stats[UNI_RAGE] = 0;
   victim->pcdata->stats[UNI_GEN] = ch->pcdata->stats[UNI_GEN] + 1;
   victim->special = 0;
   free_string (victim->morph);
   victim->morph = str_dup ("");
//                free_string(victim->clan);
//            victim->clan=str_dup(ch->clan);

   free_string (victim->lord);
   if (ch->pcdata->stats[UNI_GEN] == 1)
      victim->lord = str_dup (ch->name);
   else
   {
      sprintf (buf, "%s %s", ch->lord, ch->name);
      victim->lord = str_dup (buf);
   }

   save_char_obj (ch);
   save_char_obj (victim);
   return;
}

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

   CHAR_DATA *victim;
   char arg[MAX_INPUT_LENGTH];
   int sn;
   int level;
   int spelltype;

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_DROW)
       || !IS_SET (ch->pcdata->powers[1], DPOWER_DROWFIRE))
   {
      do_rand_typo (ch);
      return;
   }

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

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

   if (ch->mana < 100)
   {
      send_to_char ("You don't have enough mana.\n\r", ch);
      return;
   }

   if ((sn = skill_lookup ("drowfire")) < 0)
      return;
   spelltype = skill_table[sn].target;
   level = ch->spl[spelltype] * 0.5;
   (*skill_table[sn].spell_fun) (sn, level, ch, victim);
   WAIT_STATE (ch, 12);
   ch->mana = ch->mana - 100;
   return;
}

void do_cheal (CHAR_DATA *ch, char *argument)
{
   char arg1[MIL];
   char arg2[MIL];
   char arg3[MIL];
   char buf[MSL];
   CHAR_DATA *victim;
   
   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_DROW) || !IS_SET (ch->special, SPC_DROW_CLE))
   {
      do_rand_typo (ch);
      return;
   }

   if (ch->cleregen == 0)
   { stc("You don't have any points stored to use this.\n\r",ch); return; }


   if (arg1[0] == '\0' || arg2[0] == '\0' || arg3[0] == '0')
   {
      stc("Syntax: cheal <victim> <points> <hp/mp/mv>\n\r",ch);
      sprintf(buf,"You currently have %d points to use.\n\r",ch->cleregen);
      stc(buf,ch);
      return;
   }

   if ((victim = get_char_world (ch, arg1)) == NULL)
   {
      send_to_char ("Nobody by that name.\n\r", ch);
      return;
   }

   if (victim->hit <= 0)
   { stc("They must have at least 1 hit point to do this.\n\r",ch); return; }

   if (atoi (arg2) > ch->cleregen) { stc("You don't have that many points to use.\n\r",ch); return; }
   if (!str_cmp(arg3,"hp") && (atoi (arg2) < victim->max_hit)) 
   { stc("That would put them over their maximum hitpoints!\n\r",ch); return; }
   if (!str_cmp(arg3,"mp") && (atoi (arg2) < victim->max_mana)) 
   { stc("That would put them over their maximum mana points!\n\r",ch); return; }
   if (!str_cmp(arg3,"mv") && (atoi (arg2) < victim->max_move)) 
   { stc("That would put them over their maximum movement points!\n\r",ch); return; }

   if (!str_cmp(arg3,"hp")) victim->hit += atoi (arg2);
   else if (!str_cmp(arg3,"mp")) victim->mana += atoi (arg2);
   else victim->move += atoi (arg2);
   ch->cleregen -= atoi (arg2);
   sprintf(buf,"You heal %s for %d %s.",victim->name,atoi (arg2),arg3);
   stc(buf,ch);
   sprintf(buf,"%s heals you for %d %s",ch->name,atoi(arg2),arg3);
   stc(buf,victim);
   return;
}

void do_heal (CHAR_DATA * ch, char *argument)
{
   char arg[MIL];
   CHAR_DATA *victim;
   int sn, check, oldcheck;

   one_argument (argument, arg);
   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_DROW)
       || !IS_SET (ch->pcdata->powers[1], DPOWER_DROWHEAL))
   {
      do_rand_typo (ch);
      return;
   }       

   if (ch->mana < 1000)
   {
      send_to_char ("You don't have enough mana.\n\r", ch);
      return;
   }

   if (ch->position == POS_FIGHTING)
   {
      stc ("Not while fighting!\n\r", ch);
      return;
   }

   if (ch->fight_timer > 0)
   {
      send_to_char ("Not until your fight timer expires.\n\r", ch);
      return;
   }


   if ((victim = get_char_world (ch, arg)) == NULL)
   {
      send_to_char ("Heal who?\n\r", ch);
      return;
   }

   if (!IS_CLASS (victim, CLASS_DROW))
   {
      stc ("Lloth refused to aid them.\n\r", ch);
      return;
   }
   if (victim->hit > victim->max_hit)
   {
      stc ("They require no healing!\n\r", ch);
      return;
   }
   if (victim->fight_timer > 0)
   {
      stc ("Sorry you cant use that on a player that has a fight timer!\n\r",
	   ch);
      return;
   }
   if (victim->hit >= victim->max_hit)
   {
      stc ("They require no healing!\n\r", ch);
      return;
   }
   ch->mana -= 1000;
/*
   victim->hit = victim->hit + ch->spl[BLUE_MAGIC] * 3;
   if (victim->hit > victim->max_hit)
      victim->hit = victim->max_hit;
   act ("You heal $N.", ch, NULL, victim, TO_CHAR);
   act ("You are healed by Lloth.", ch, NULL, victim, TO_VICT);
   act ("$n is healed by Lloth.", ch, NULL, victim, TO_ROOM);
   WAIT_STATE (ch, 12);
*/
   if ((check = victim->loc_hp[6]) > 0)
   {
      oldcheck = 0;
      sn = skill_lookup ("clot");
      while (oldcheck != (check = victim->loc_hp[6]))
      {
	 oldcheck = check;
	 (*skill_table[sn].spell_fun) (sn, ch->level, ch, victim);
      }
   }
   if ((check = (victim->loc_hp[0] + victim->loc_hp[1] + victim->loc_hp[2] +
		 victim->loc_hp[3] + victim->loc_hp[4] + victim->loc_hp[5])) >
       0)
   {
      oldcheck = 0;
      while (oldcheck != (check = victim->loc_hp[0] + victim->loc_hp[1] +
			  victim->loc_hp[2] + victim->loc_hp[3] +
			  victim->loc_hp[4] + victim->loc_hp[5]))
      {
	 oldcheck = check;
	 reg_mend (victim);
      }
   }
   if (victim->hit < victim->max_hit)
   {
      if (!IS_SET (ch->special, SPC_DROW_CLE))
          victim->hit += victim->max_hit / 2;
      else victim->hit = victim->max_hit;
      send_to_char ("You have been healed by LLoth!\n\r", victim);
      act ("$n has been healed by Lloth!", victim, NULL, NULL, TO_ROOM);
      update_pos (victim);
   }
   return;
}

/* Drow Restore Command to go here.... Cleric only */

void do_shadowwalk (CHAR_DATA * ch, char *argument)
{   
   char arg[MAX_INPUT_LENGTH];
   CHAR_DATA *victim;
   CHAR_DATA *mount;
   
   one_argument (argument, arg);
    
   if (!IS_IMMORTAL (ch))
   {
      if (!IS_CLASS (ch, CLASS_DROW) || !IS_SET (ch->pcdata->powers[1], DPOWER_SHADOWWALK))
      {
        do_rand_typo (ch);
        return;
      }
   }
   
   if (arg[0] == '\0')
   {
      send_to_char ("Shadowwalk to whom?\n\r", ch);
      return;
   }
   
   if (ch->move < 500)
   {
      stc ("You are too exhausted.\n\r", ch);
      return;
   }
   if (ch->fight_timer > 0)
   {
      stc ("Wait for your fight timer to expire first!!\n\r", ch);
      return;
   }   
   
   if (ch->position == POS_FIGHTING)
   {
      send_to_char ("No way! You are fighting.\n\r", ch);
      return;
   }
   
   if ((victim = get_char_world (ch, arg)) == NULL)
   {
      send_to_char ("Nobody by that name.\n\r", ch);
      return;
   }
   if IS_SET
      (victim->in_room->room_flags, ROOM_CCHAMBER)
   {
      stc ("You failed.\n\r", ch);
      return;
   }
   if (IS_NPC (victim) && IS_SET (victim->in_room->area->aflags, AFLAG_HQ))
   {
      stc ("You failed.\n\r", ch);
      return;
   }
   if (victim->in_room == NULL)
   {
      stc ("You are already there!\n\r", ch);
      return;
   }
   
   if (victim == ch)
   {
      stc ("Not to yourself.\n\r", ch);
      return;
   }

   if ((!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_NO_RECALL)
       || victim->level > 150  
       || IS_SET (victim->in_room->room_flags, ROOM_PRIVATE)
       || IS_SET (victim->in_room->room_flags, ROOM_SOLITARY)
       || IS_SET (victim->in_room->room_flags, ROOM_NO_RECALL)
       || victim->in_room->vnum == ch->in_room->vnum)
   {
      send_to_char ("You failed.\n\r", ch);
      return;
   }
      
   act ("You walk into the shadows.", ch, NULL, NULL, TO_CHAR);
   act ("$n walks into the shadows.", ch, NULL, NULL, TO_ROOM);
   ch->move -= 500;
   char_from_room (ch);
   char_to_room (ch, get_room_index (victim->in_room->vnum));
   do_look (ch, "auto");
   act ("You walk out of the shadows.", ch, NULL, NULL, TO_CHAR);
   act ("$n walks out of the shadows.", ch, NULL, NULL, TO_CHAR);

   if ((mount = victim->mount) == NULL)
      return;
   char_from_room (mount);
   char_to_room (mount, get_room_index (victim->in_room->vnum));
   do_look (mount, "auto");
   return;
}

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

   one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_DROW)
       || !IS_SET (ch->pcdata->powers[1], DPOWER_SHADOWWALK))
   {
      do_rand_typo (ch);
      return;
   }

   if (ch->fight_timer > 0)
   {
      send_to_char ("Not until your fight timer expires.\n\r", ch);
      return;
   }

   if ((victim = get_char_world (ch, arg)) == NULL)
   {
      send_to_char ("Shadowwalk to whom?\n\r", ch);
      return;
   }

   location = victim->in_room;

   if (ch->move < 250)
   {
      send_to_char ("You are too tired to go shadowwalking.\n\r", ch);
      return;
   }

   if (!IS_NPC (victim))
   {
      send_to_char ("You failed.\n\r", ch);
      return;
   }

   if (IS_NPC (victim) && victim->level > 150)
   {
      stc ("You failed.\n\r", ch);
      return;
   }
   if (!IS_SET (victim->in_room->room_flags, ROOM_DARK)
       && !IS_SET (victim->in_room->room_flags, ROOM_TOTAL_DARKNESS))
   {
      send_to_char ("You failed.\n\r", ch);
      return;
   }

   act ("You walk into the shadows.", ch, NULL, NULL, TO_CHAR);
   act ("$n walks into the shadows.", ch, NULL, NULL, TO_ROOM);
   ch->move -= 250;
   char_from_room (ch);
   char_to_room (ch, location);
   do_look (ch, "auto");
   act ("You walk out of the shadows.", ch, NULL, NULL, TO_CHAR);
   act ("$n walks out of the shadows.", ch, NULL, NULL, TO_CHAR);

   return;
}

void do_drowhate (CHAR_DATA * ch, char *argument)
{
   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_DROW)
       || !IS_SET (ch->pcdata->powers[1], DPOWER_DROWHATE))
   {
      do_rand_typo (ch);
      return;
   }

   if (IS_SET (ch->newbits, NEW_DROWHATE))
   {
      send_to_char ("You calm your hatred.\n\r", ch);
      REMOVE_BIT (ch->newbits, NEW_DROWHATE);
   }
   else
   {
      send_to_char ("You invoke your hatred for others.\n\r", ch);
      SET_BIT (ch->newbits, NEW_DROWHATE);
   }

   return;
}

void do_spiderform (CHAR_DATA * ch, char *argument)
{
   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_DROW)
       || !IS_SET (ch->pcdata->powers[1], DPOWER_SPIDERFORM))
   {
      do_rand_typo (ch);
      return;
   }

   if (IS_POLYAFF (ch, POLY_ZULO))
   {
      send_to_char ("Not while in driderform.\n\r", ch);
      return;
   }

   if (IS_POLYAFF (ch, POLY_SPIDERFORM))
   {
      REMOVE_BIT (ch->polyaff, POLY_SPIDERFORM);
      REMOVE_BIT (ch->affected_by, AFF_POLYMORPH);
      act ("You transform into human form.", ch, NULL, NULL, TO_CHAR);
      act ("$n's shrinks back into human form.", ch, NULL, NULL, TO_ROOM);
      free_string (ch->morph);
      ch->morph = str_dup ("");
      return;
   }
   else if (IS_AFFECTED (ch, AFF_POLYMORPH))
   {
      send_to_char ("You cant spider form when changed.\n\r", ch);
      return;
   }
   if (ch->stance[0] != -1)
      do_stance (ch, "");
   if (ch->mounted == IS_RIDING)
      do_dismount (ch, "");
   act ("You transform into a giant spider", ch, NULL, NULL, TO_CHAR);
   act ("$n's body grows and distorts into a giant spider.", ch, NULL, NULL,
	TO_ROOM);

   SET_BIT (ch->polyaff, POLY_SPIDERFORM);
   SET_BIT (ch->affected_by, AFF_POLYMORPH);
   sprintf (buf, "%s the giant myrlochar", ch->name);
   free_string (ch->morph);
   ch->morph = str_dup (buf);
   return;
}

/*
void do_spiderform( CHAR_DATA *ch, char *argument ) 
{
	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_DROW) || !IS_SET(ch->pcdata->powers[1], DPOWER_SPIDERFORM))
	{send_to_char("Huh?\n\r", ch );
	return;}

	if (IS_AFFECTED(ch, AFF_POLYMORPH)) 
      {
	send_to_char("You can't spiderform while changed.\n\r", ch );
	return;
      }

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

	if (ch->move < 500) {
	send_to_char("You don't have the energy to change.\n\r", ch );
	return;}

      if (ch->cur_form == get_normal_form(ch))
      {
	ch->move -= 500;
	
	act("You mutate into a giant spider.",ch,NULL,NULL,TO_CHAR);
        act("$n mutates into a giant spider.",ch,NULL,NULL,TO_ROOM);
        set_form(ch, FRM_DROWSPIDER);
	return;
    }

	return;
}
*/

void do_drows (CHAR_DATA * ch, char *argument)
{
   char buf[MAX_STRING_LENGTH];
   char arg[MAX_INPUT_LENGTH];
   CHAR_DATA *gch;
   char clan[MSL];
   one_argument (argument, arg);

   if (IS_NPC (ch))
      return;
   if (!IS_CLASS (ch, CLASS_DROW))
   {
      do_rand_typo (ch);
      return;
   }
   sprintf (buf, "The Followers of Lloth:\n\r");
   send_to_char (buf, ch);
   send_to_char
      ("[      Name      ] [     House    ] [ 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_DROW))
	 continue;
      if (IS_IMMORTAL (gch) && !can_see (ch, gch))
         continue;
      if (gch->clannum > 0)
          sprintf(clan, "%s", nclans_table[gch->clannum].name);
      else
          sprintf(clan, "None");
      sprintf (buf, "[%-16s] [%-13s] [%-6d] [%-6d] [%-6d] [%10lli] [ %-9d ]\n\r",
	       capitalize (gch->name), clan, gch->hit, gch->mana, gch->move,
	       gch->exp, gch->pcdata->stats[DROW_POWER]);
      send_to_char (buf, ch);
   }
   return;
}

void do_drowsight (CHAR_DATA * ch, char *argument)
{
   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_DROW)
       || !IS_SET (ch->pcdata->powers[1], DPOWER_DROWSIGHT))
   {
      do_rand_typo (ch);
      return;
   }

   if (IS_SET (ch->act, PLR_HOLYLIGHT))
   {
      REMOVE_BIT (ch->act, PLR_HOLYLIGHT);
      send_to_char ("Your senses return to normal.\n\r", ch);
   }
   else
   {
      SET_BIT (ch->act, PLR_HOLYLIGHT);
      send_to_char ("Your senses increase to incredible proportions.\n\r",
		    ch);
   }

   return;
}

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

   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_DROW)
       || !IS_SET (ch->pcdata->powers[1], DPOWER_DROWSHIELD))
   {
      do_rand_typo (ch);
      return;
   }

   if (!IS_IMMUNE (ch, IMM_SHIELDED))
   {
      send_to_char ("You shield your aura from those around you.\n\r", ch);
      SET_BIT (ch->immune, IMM_SHIELDED);
      return;
   }
   send_to_char ("You stop shielding your aura.\n\r", ch);
   REMOVE_BIT (ch->immune, IMM_SHIELDED);

   return;
}

void do_drowpowers (CHAR_DATA * ch, char *argument)
{
   int count = 0;
   char buf[MAX_STRING_LENGTH];

   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_DROW))
   {
      do_rand_typo (ch);
      return;
   }

   stc ("#c.oO==========================================================================Oo.#n\n\r", ch);
   cent_to_char ("#w-[ Drow Powers ]-#n", ch);
   stc ("#c.oO==========================================================================Oo.#n\n\r", ch);
   stc ("#cThe powers Lloth has bestowed upon you:#n\n\r", ch);
   if (IS_SET (ch->pcdata->powers[1], DPOWER_CONFUSE))
   {
      send_to_char ("#w         Confuse\n\r", ch);
      count += 1;
   }
   if (IS_SET (ch->pcdata->powers[1], DPOWER_DARKNESS))
   {
      send_to_char ("#w         Darkness\n\r", ch);
      count += 1;
   }
   if (IS_SET (ch->pcdata->powers[1], DPOWER_DARKTENDRILS))
   {
      send_to_char ("#w         Darktendrils\n\r", ch);
      count += 1;
   }
   if (IS_SET (ch->pcdata->powers[1], DPOWER_DGAROTTE))
   {
      send_to_char ("#w         Dgarotte\n\r", ch);
      count += 1;
   }
   if (IS_SET (ch->pcdata->powers[1], DPOWER_DRIDERFORM))
   {
      send_to_char ("#w         Driderform\n\r", ch);
      count += 1;
   }
   if (IS_SET (ch->pcdata->powers[1], DPOWER_DROWFIRE))
   {
      send_to_char ("#w         Drowfire\n\r", ch);
      count += 1;
   }
   if (IS_SET (ch->pcdata->powers[1], DPOWER_DROWHATE))
   {
      send_to_char ("#w         Drowhate\n\r", ch);
      count += 1;
   }
   if (IS_SET (ch->pcdata->powers[1], DPOWER_DROWPOISON))
   {
      send_to_char ("#w         Drowpoison (Auto)\n\r", ch);
      count += 1;
   }
   if (IS_SET (ch->pcdata->powers[1], DPOWER_DROWSIGHT))
   {
      send_to_char ("#w         Drowsight\n\r", ch);
      count += 1;
   }
   if (IS_SET (ch->pcdata->powers[1], DPOWER_EARTHSHATTER))
   {
      send_to_char ("#w         Earthshatter\n\r", ch);
      count += 1;
   }
   if (IS_SET (ch->pcdata->powers[1], DPOWER_FIGHTDANCE))
   {
      send_to_char ("#w         Fightdance\n\r", ch);
      count += 1;
   }
   if (IS_SET (ch->pcdata->powers[1], DPOWER_GAROTTE))
   {
      send_to_char ("#w         Garotte\n\r", ch);
      count += 1;
   }
   if (IS_SET (ch->pcdata->powers[1], DPOWER_GLAMOUR))
   {
      send_to_char ("#w         Glamour\n\r", ch);
      count += 1;
   }
   if (IS_SET (ch->pcdata->powers[1], DPOWER_LEVITATION))
   {
      send_to_char ("#w         Levitation (Auto)\n\r", ch);
      count += 1;
   }
   if (IS_SET (ch->pcdata->powers[1], DPOWER_REGEN))
   {
      send_to_char ("#w         Llothsregen (Auto)\n\r", ch);
      count += 1;
   }
   if (IS_SET (ch->pcdata->powers[1], DPOWER_DROWSCRY))
   {
      send_to_char ("#w         Scry\n\r", ch);
      count += 1;
   }
   if (IS_SET (ch->pcdata->powers[1], DPOWER_SHADOWBODY))
   {
      send_to_char ("#w         Shadowbody (Auto)\n\r", ch);
      count += 1;
   }
   if (IS_SET (ch->pcdata->powers[1], DPOWER_SHADOWWALK))
   {
      send_to_char ("#w         Shadowwalk\n\r", ch);
      count += 1;
   }
   if (IS_SET (ch->pcdata->powers[1], DPOWER_DROWSHIELD))
   {
      send_to_char ("#w         Shield\n\r", ch);
      count += 1;
   }
   if (IS_SET (ch->pcdata->powers[1], DPOWER_SPEED))
   {
      send_to_char ("#w         Speed (Auto)\n\r", ch);
      count += 1;
   }
   if (IS_SET (ch->pcdata->powers[1], DPOWER_ARMS))
   {
      send_to_char ("#w         Spiderarms (Auto)\n\r", ch);
      count += 1;
   }
   if (IS_SET (ch->pcdata->powers[1], DPOWER_SPIDERFORM))
   {
      send_to_char ("#w         Spiderform\n\r", ch);
      count += 1;
   }
   if (IS_SET (ch->pcdata->powers[1], DPOWER_TOUGHSKIN))
   {
      send_to_char ("#w         Toughskin (Auto)\n\r", ch);
      count += 1;
   }
   if (IS_SET (ch->pcdata->powers[1], DPOWER_WEB))
   {
      send_to_char ("#w         Web\n\r", ch);
      count += 1;
   }
   if (count == 0)
      stc ("#w         None\n\r", ch);
   count = 0;
   stc ("#cOther Drowclass details:#n\n\r", ch);

   if (ch->pcdata->stats[UNI_GEN] == 1)
      send_to_char ("#w         You are Lloth's Avatar.\n\r", ch);

   if ((ch->pcdata->stats[UNI_GEN] == 2) && (ch->sex == SEX_FEMALE))
      send_to_char ("#w         You are a Drow Matron.\n\r", ch);

   if ((ch->pcdata->stats[UNI_GEN] == 2) && (ch->sex == SEX_MALE))
      send_to_char ("#w         You are a Drow Patron.\n\r", ch);

   if (IS_SET (ch->special, SPC_DROW_WAR))
      send_to_char ("#w         You are a Drow Warrior.\n\r", ch);

   if (IS_SET (ch->special, SPC_DROW_MAG))
      send_to_char ("#w         You are a Drow Mage.\n\r", ch);

   if (IS_SET (ch->special, SPC_DROW_CLE))
      send_to_char ("#w         You are a Drow Cleric.\n\r", ch);

   sprintf (buf, "#w         You have %d drow power points!.\n\r",
	    ch->pcdata->stats[DROW_POWER]);
   send_to_char (buf, ch);

   sprintf (buf, "#w         You have %d points of magic resistance.\n\r",
	    ch->pcdata->stats[DROW_MAGIC]);
   send_to_char (buf, ch);

   if (weather_info.sunlight == SUN_DARK)
      send_to_char ("#w         You feel strong in the night.\n\r", ch);
   if (ch->pcdata->stats[UNI_GEN] < 3)
      send_to_char ("#w         You can class other drow <Llothsfavor>\n\r",
		    ch);
   stc ("#c.oO==========================================================================Oo.#n\n\r", ch);

   return;
}

void do_darkness (CHAR_DATA * ch, char *argument)
{
   bool blah = FALSE;

   if (IS_NPC (ch))
      return;

   if (ch->fight_timer > 0)
   {
      send_to_char ("Not until your fight timer expires.\n\r", ch);
      return;
   }

   if (((!IS_CLASS (ch, CLASS_DROW) && (!WORN_ARTIFACT (ch, ARTI_HEART_OF_DARKNESS)))
       || (!IS_SET (ch->pcdata->powers[1], DPOWER_DARKNESS) && (!WORN_ARTIFACT (ch, ARTI_HEART_OF_DARKNESS)))))
   {
      do_ddarkness (ch, argument);
      return;
   }

   if (IS_SET (ch->newbits, NEW_DARKNESS))
   {
      send_to_char ("You banish your globe of darkness.\n\r", ch);
      act ("The globe of darkness around $n disappears.", ch, NULL, NULL,
	   TO_ROOM);
      REMOVE_BIT (ch->newbits, NEW_DARKNESS);
      if (ch->in_room != NULL)
	 if (IS_SET (ch->in_room->room_flags, ROOM_TOTAL_DARKNESS))
	    REMOVE_BIT (ch->in_room->room_flags, ROOM_TOTAL_DARKNESS);
      return;
   }


   if (WORN_ARTIFACT (ch, ARTI_HEART_OF_DARKNESS))
   {

      if (ch->mana < 1000 )
      {
         send_to_char ("You don't have enough mana to summon the darkness.\n\r",
                       ch);
         return;
      }
   }
   else
   {
      if (ch->mana < 500 )
      {
         send_to_char ("You don't have enough mana to summon the darkness.\n\r",
   		    ch);
         return;
      }
   }

   send_to_char ("You summon a globe of darkness.\n\r", ch);
   act ("$n summons a globe of darkness.", ch, NULL, NULL, TO_ROOM);
   if (WORN_ARTIFACT(ch, ARTI_HEART_OF_DARKNESS)) ch->mana -= 1000;
   else ch->mana -= 500;
   if (IS_SET (ch->extra, TIED_UP))
   {
      REMOVE_BIT (ch->extra, TIED_UP);
      blah = TRUE;
   }

   if (IS_AFFECTED (ch, AFF_WEBBED))
   {
      REMOVE_BIT (ch->affected_by, AFF_WEBBED);
      blah = TRUE;
   }

   if (blah)
      send_to_char ("The darkness sets you free.\n\r", ch);

   SET_BIT (ch->newbits, NEW_DARKNESS);
   if (!IS_SET (ch->in_room->room_flags, ROOM_TOTAL_DARKNESS))
      SET_BIT (ch->in_room->room_flags, ROOM_TOTAL_DARKNESS);

   return;
}

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

   char arg1[MAX_STRING_LENGTH];
   char arg2[MAX_STRING_LENGTH];
   OBJ_DATA *obj;

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

   if (IS_NPC (ch))
      return;
   if (!IS_CLASS (ch, CLASS_DROW)
       || !IS_SET (ch->pcdata->powers[1], DPOWER_GLAMOUR))
   {
      do_rand_typo (ch);
      return;
   }

   if (arg1 == NULL || arg2 == NULL)
   {
      send_to_char ("Syntax: Glamour (item) (description)\n\r", ch);
      return;
   }

   if (!str_cmp (arg2, "Tijer"))
   {
      send_to_char ("You failed!\r\n", ch);
      return;
   }
   if ((obj = get_obj_carry (ch, arg1)) == NULL)
   {
      send_to_char ("You dont have that item.\n\r", ch);
      return;
   }

   if (strlen (arg2) > 40 || strlen (arg2) < 3)
   {
      send_to_char ("From 3 to 40 characters please.\n\r", ch);
      return;
   }

   if (obj->item_type == ITEM_QUEST || obj->item_type == ITEM_AMMO ||
       obj->item_type == ITEM_EGG || obj->item_type == ITEM_VOODOO ||
       obj->item_type == ITEM_MONEY || obj->item_type == ITEM_TREASURE || obj->item_type == ITEM_AQUEST ||
       obj->item_type == ITEM_TOOL || obj->item_type == ITEM_SYMBOL ||
       obj->item_type == ITEM_PIECE
       || obj->item_type == ITEM_PAGE || IS_SET (obj->quest, QUEST_ARTIFACT)
       || IS_SET (obj->quest, QUEST_RELIC))
   {
      send_to_char ("You cannot glamour that item.\n\r", ch);
      return;
   }
   free_string (obj->name);
   obj->name = str_dup (arg2);
   free_string (obj->short_descr);
   obj->short_descr = str_dup (arg2);
   free_string (obj->questmaker);
   obj->questmaker = str_dup (ch->name);
   send_to_char ("Ok.\n\r", ch);
   return;
}

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

   CHAR_DATA *victim;

   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_DROW)
       || !IS_SET (ch->pcdata->powers[1], DPOWER_CONFUSE))
   {
      do_rand_typo (ch);
      return;
   }

   if ((victim = ch->fighting) == NULL)
   {
      send_to_char ("You are not fighting anyone.\n\r", ch);
      return;
   }

   if (ch->move < 500)
   {
      send_to_char ("You need 500 move to confuse your opponent.\n\r", ch);
      return;
   }

   act ("$n attempts to confuse you.", ch, NULL, victim, TO_VICT);
   act ("You attempt to confuse $N.", ch, NULL, victim, TO_CHAR);
   act ("$n attempts to confuse $N.", ch, NULL, victim, TO_NOTVICT);

   ch->move -= 500;

   if (victim->dconfuse_counter > 0)
   { stc("They are confused already!\n\r",ch); return; }

   if (!IS_NPC (victim) && (get_hours (ch) < 10) && !IS_NPC (ch)
       && (ch != victim) && !IS_SET (ch->extra2, PKREADY))
   {
      stc ("You are unable to attack players untill you reach 10 hours!.\n\r",
           ch);
      return;
   }

   if (number_range (1, 5) == 5)
   {
      send_to_char ("You start to feel a bit confused!\n\r", victim);
      act ("$n is confused!", victim, NULL,
           NULL, TO_ROOM);
      victim->dconfuse_counter = 50;
      WAIT_STATE (ch, 15);
   }
   else stc("You failed.\n\r",ch);
   WAIT_STATE (ch, 10);
   return;
}

void do_earthshatter (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *vch;
   CHAR_DATA *vch_next;
   int dam;
   int level;
   int number_hit = 0;

   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_DROW)
       || !IS_SET (ch->pcdata->powers[1], DPOWER_EARTHSHATTER))
   {
      do_rand_typo (ch);
      return;
   }

   if (ch->mana < ch->damcap[DAM_CAP] / 2)
   {
      send_to_char ("You need more mana.\n\r", ch);
      return;
   }

   level = ch->spl[PURPLE_MAGIC];
   ch->mana -= ch->damcap[DAM_CAP] / 2;

   send_to_char
      ("You summon the power of the underworld, shattering the earth.\n\r",
       ch);
   act ("$n causes the earth to shatter", ch, NULL, NULL, TO_ROOM);

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

      if (number_hit > 10)
         continue;

      if (vch == ch)
	 continue;
//      dam = ch->damcap[DAM_CAP];
      dam = dice (ch->damroll, 7) + number_range(ch->damcap[DAM_CAP]/16,ch->damcap[DAM_CAP]/8);
      dam *= level / 20;
      if (saves_spell (level, vch))
	 dam /= 2;
      if (!IS_NPC(vch))
	 dam /= 2;
      damage (ch, vch, dam, skill_lookup ("earth shatter"));
      if (level >= 200)
      {
         dam = dice (ch->damroll, 7) + number_range(ch->damcap[DAM_CAP]/16,ch->damcap[DAM_CAP]/8);
         dam *= level / 20;
         if (saves_spell (level, vch))
            dam /= 2;
         if (!IS_NPC(vch))
            dam /= 2;
         damage (ch, vch, dam, skill_lookup ("earth shatter"));
      }
      if (ch->spl[RED_MAGIC] + ch->spl[BLUE_MAGIC] + ch->spl[GREEN_MAGIC] + ch->spl[YELLOW_MAGIC] >= 800 && IS_NPC(vch))
      {
         dam = dice (ch->damroll, 7) + number_range(ch->damcap[DAM_CAP]/16,ch->damcap[DAM_CAP]/8);
         dam *= level / 20;
         if (saves_spell (level, vch))
            dam /= 2;
         if (!IS_NPC(vch))
            dam /= 2;
         damage (ch, vch, dam, skill_lookup ("earth shatter"));
      }
      number_hit++;
   }
   WAIT_STATE (ch, 12);
   return;
}