cotn25/area/
cotn25/src/
/***************************************************************************
 *  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"

/*
 * Local functions.
 */
void do_drowforge( 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) && !IS_CLASS(ch, CLASS_BLACK_ASSASSIN)
  && !IS_CLASS(ch, CLASS_STALKER) && !IS_CLASS(ch, CLASS_SHADOWBORN))
    {
	    send_to_char("Huh?\n\r",ch);
	    return;
    }

    if (arg[0] == '\0')
    {
	send_to_char("Which Weapon do you wish to Create.\n\r", ch );
	send_to_char("Hook Sword       Tanto Katana\n\r", ch);
	send_to_char("Saber            War Hammer     \n\r", ch );
	send_to_char("Dragon Slayer     \n\r", ch);
	return;
    }
    if      (!str_cmp(arg,"hook"     )) vnum = 81101;
    else if (!str_cmp(arg,"saber"   )) vnum = 81102;
    else if (!str_cmp(arg,"dragon"    )) vnum = 81104;
    else if (!str_cmp(arg,"tanto"   )) vnum = 81103;
    else if (!str_cmp(arg,"hammer")) vnum = 81105;
    else
    {
        do_drowforge(ch,"");
	return;
    }

    if ( ch->practice < 2500)
    {
	send_to_char("It Costs 2500 Primal to create a Drow Forged Weapon.\n\r",ch);
	return;
    }
    

    if ( vnum == 0 || (pObjIndex = get_obj_index( vnum )) == NULL)
    {
	send_to_char("Missing object, please inform Xrakisis.\n\r",ch);
	return;
    }

    ch->practice -= 2500;
    obj = create_object(pObjIndex, 50);
    obj->questowner = str_dup(ch->pcdata->switchname);
    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_lloth( CHAR_DATA *ch, char *argument )
{
  char buf[MAX_STRING_LENGTH];
  CHAR_DATA *gch;
  
  if (IS_NPC(ch)) return;
  if (!IS_CLASS(ch, CLASS_DROW) && !IS_CLASS(ch, CLASS_BLACK_ASSASSIN)
  && !IS_CLASS(ch, CLASS_STALKER) && !IS_CLASS(ch, CLASS_SHADOWBORN))  {
    send_to_char("Huh?\n\r",ch);
    return;
  }
  send_to_char("#p          -*-  The Church of Lloth  -*-#n\n\r",ch);
  send_to_char("#7[#pName                #7] [#p  Hp   #7] [#p Mana  #7] [#p Move  #7] [#p Gen  #7 ]#n\n\r",ch);
  for ( gch = char_list; gch != NULL; gch = gch->next)
  {
    if (IS_NPC(gch)) continue;
    if (!IS_CLASS(gch, CLASS_DROW) && !IS_CLASS(gch, CLASS_CYBORG)) continue;
    sprintf( buf,"#7[%-20s] [%-7d] [%-7d] [%-7d] [%-7d]#n\n\r",
    capitalize( gch->name ), gch->hit, gch->mana, gch->move, gch->generation);
    send_to_char( buf, ch );
  }
  return;
}

void do_grant( CHAR_DATA *ch, char *argument )
{
    CHAR_DATA *victim;
    char      arg1 [MAX_INPUT_LENGTH];
    char      arg2 [MAX_INPUT_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) && !IS_CLASS(ch, CLASS_BLACK_ASSASSIN)
  && !IS_CLASS(ch, CLASS_STALKER) && !IS_CLASS(ch, CLASS_SHADOWBORN))
    {
	    send_to_char("Huh?\n\r",ch);
	    return;
    }

    if ( arg1[0] == '\0' || arg2[0] == '\0' )
	{
	
	send_to_char( "Syntax: Grant <person> <power>\n\r", ch );
		send_to_char("Warrior (0), Mage (0), Cleric (0).\n\r", ch );
		send_to_char("Train your disciplines for your powers.\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 (!IS_CLASS(victim, CLASS_DROW) && !IS_CLASS(victim, CLASS_BLACK_ASSASSIN)
  && !IS_CLASS(victim, CLASS_STALKER) && !IS_CLASS(victim, CLASS_SHADOWBORN)) {
                send_to_char("Only on drows.\n\r", ch );
                return;}


    if (!str_cmp(arg2,"mage") || !str_cmp(arg2,"warrior") || !str_cmp(arg2, "cleric" ))
    {
	if (victim->generation < 2 )
	{	send_to_char("Not on them!\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)) && ch->level < 6 && ch->generation >= 2)
  {		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);
	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 (!(ch==victim)) cost *=5;

    if (IS_SET(victim->pcdata->powers[1], inpart))
    {
	send_to_char("They have already got that power.\n\r",ch);
	return;
    }

  if (!IS_CLASS(victim, CLASS_DROW) && !IS_CLASS(victim, CLASS_BLACK_ASSASSIN)
  && !IS_CLASS(victim, CLASS_STALKER) && !IS_CLASS(victim, CLASS_SHADOWBORN)) 
    {
	stc( "You can not grant powers to Non Drows.\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);
    send_to_char("Ok.\n\r",ch);
    if (victim != ch) save_char_obj(ch);
    save_char_obj(victim);
    return; 
}

void do_chaosblast(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 (ch->power[DISC_DROW_RAVE] < 2 )
    {
	send_to_char("You Need To Get Your Raven to 2 for this..\n\r",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 (ch->mana < 750) {
                send_to_char("You don't have enough mana.\n\r", ch);
                return;}

    if ( ( sn = skill_lookup( "chaos blast" ) ) < 0 ) return;
    spelltype = skill_table[sn].target;
    level = ch->spl[spelltype]/3;
        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 );
    WAIT_STATE( ch, 12 );
        ch->mana = ch->mana - 750;
    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) && !IS_CLASS(ch, CLASS_BLACK_ASSASSIN)
  && !IS_CLASS(ch, CLASS_STALKER) && !IS_CLASS(ch, CLASS_SHADOWBORN))
    {
	    send_to_char("Huh?\n\r",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 = 33061;
    else if (!str_cmp(arg,"cloak"   )) vnum = 33070;
    else if (!str_cmp(arg,"armor"    )) vnum = 33073;
    else if (!str_cmp(arg,"boots"   )) vnum = 33067;
    else if (!str_cmp(arg,"gauntlets")) vnum = 33068;
    else if (!str_cmp(arg,"sleeves")) vnum = 33069;
    else if (!str_cmp(arg,"belt"))   vnum = 33062;
    else if (!str_cmp(arg,"helmet"))	vnum = 33065;
    else if (!str_cmp(arg,"leggings"))	vnum = 33066;
    else if (!str_cmp(arg,"mask" )) vnum = 33072;
    else if (!str_cmp(arg,"bracer"    )) vnum = 33071;
    else if (!str_cmp(arg,"dagger"	)) vnum = 33060;
    else if (!str_cmp(arg, "ring"))	vnum = 33063;
    else if (!str_cmp(arg, "amulet"))	vnum = 33064;
    else
    {
	send_to_char("That is an invalid type.\n\r", ch );
	return;
    }

    
    if ( ch->practice < 100)
    {
	send_to_char("It costs 100 points of primal 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 Jobo.\n\r",ch);
	return;
    }

    ch->practice -= 100;
    obj = create_object(pObjIndex, 50);
    obj->questowner = str_dup(ch->pcdata->switchname);
    obj->ownerid = ch->pcdata->playerid;
    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_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 (ch->power[DISC_DROW_PIRA] < 5 )
    {
	send_to_char("You Need To Get Your Pirana to 5 for this..\n\r",ch);
    	return;
    }

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

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

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

    if ( ( sn = skill_lookup( "drowfire" ) ) < 0 ) return;
    spelltype = skill_table[sn].target;
    level = ch->spl[spelltype] * 9.5;
    (*skill_table[sn].spell_fun) ( sn, level, ch, victim );
    WAIT_STATE( ch, 10 );
	ch->mana -= 4000;
    return;
}
void do_heal ( CHAR_DATA *ch, char *argument ) 
{
        if (IS_NPC(ch)) return;

  if (!IS_CLASS(ch, CLASS_DROW) && !IS_CLASS(ch, CLASS_BLACK_ASSASSIN)
  && !IS_CLASS(ch, CLASS_STALKER) && !IS_CLASS(ch, CLASS_SHADOWBORN))
            {
		send_to_char("Huh?\n\r", ch );
		return;
            }
  if (ch->mana < 750)
  {
		send_to_char("You don't have enough mana.\n\r", ch );
    return;
  }
	ch->mana = ch->mana - 750;
        ch->hit = ch->hit + ch->spl[BLUE_MAGIC]*5;
        if (IS_SET(ch->special,SPC_DROW_CLE))
	ch->hit = ch->hit + ch->spl[BLUE_MAGIC]*3;
	if (ch->hit > ch->max_hit) ch->hit = ch->max_hit;
	send_to_char("Lloth heals you.\n\r",ch);
	act("$n is healed by Lloth.",ch,NULL,NULL,TO_ROOM);
	WAIT_STATE(ch, 12);
	return;
}

void do_shadowwalk(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_CLASS(ch, CLASS_BLACK_ASSASSIN)
  && !IS_CLASS(ch, CLASS_STALKER) && !IS_CLASS(ch, CLASS_SHADOWBORN) && ch->power[DISC_DROW_RAVE] < 2 )
    {
	send_to_char("You Need To Get Your Raven to 2 for this..\n\r",ch);
    	return;
    }

	if ((victim = get_char_world(ch, arg)) == NULL) 
        {
           if(IS_CLASS(ch,CLASS_CYBORG))
              send_to_char("upload yourself to whom?\n\r", ch);
           else
	send_to_char("Shadowwalk to whom?\n\r", ch );
	return;
        }
           if (IS_SET(victim->act, ACT_NOTRAVEL))
  {
  	send_to_char("No Can Do.\n\r", ch);
  	return;
  }
 if( IS_SET(victim->in_room->room_flags, ROOM_ASTRAL))
  { 
    stc( "You can't find it's room.\n\r",ch);
    return; 
  } 

    if (IS_IMMUNE(victim, IMM_TRAVEL) && victim->fight_timer < 1 )
    {
        send_to_char("I don't think they want you to do that.\n\r",ch);
        return;
    } 
  if (IS_SET(ch->in_room->room_flags, ROOM_ASTRAL))
  {
    stc( "Your room is not connected to the astral plane.\n\r",ch);
    return;
  }
	location = victim->in_room;

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

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

	if (!IS_SET(victim->in_room->room_flags, ROOM_DARK)) {
	send_to_char("You failed.\n\r", ch );
	return;}*/

        if(IS_CLASS(ch, CLASS_CYBORG))
        {
          act("You become line noise and move at lightspeed.", ch, NULL, NULL, TO_CHAR);
          act("$n becomes line noise and moves at lightspeed.", ch, NULL, NULL, TO_ROOM);
        }
        else
        {
	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");	
        /* fix for cyborgs */	
	act("You walk out of the shadows.", ch, NULL, NULL, TO_CHAR);
	act("$n walks out of the shadows.", ch, NULL, NULL, TO_ROOM);

	return;
}

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

    if (ch->power[DISC_DROW_PIRA] < 8 )
    {
	send_to_char("You Need To Get Your Pirana to 8 for this..\n\r",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_darktendrils(CHAR_DATA *ch, char *argument)
{
	if (IS_NPC(ch)) return;

  if (!IS_CLASS(ch, CLASS_DROW) && !IS_CLASS(ch, CLASS_BLACK_ASSASSIN)
  && !IS_CLASS(ch, CLASS_STALKER) && !IS_CLASS(ch, CLASS_SHADOWBORN) && ch->power[DISC_DROW_JELL] < 3 )
    {
	send_to_char("You Need To Get Your Jelly Fish to 3 for this..\n\r",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->newbits, NEW_DARKTENDRILS)) {
	send_to_char("Your tendrils of darkness disappear.\n\r", ch );
	REMOVE_BIT(ch->newbits, NEW_DARKTENDRILS);
	}
	else {
	send_to_char("You call forth dark tendrils to attack your foes.\n\r", ch );
	SET_BIT(ch->newbits, NEW_DARKTENDRILS);
	}

	return;
}

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

    if (ch->power[DISC_DROW_ARAC] < 5 )
    {
	send_to_char("You Need To Get Your Arachnid to 5 for this..\n\r",ch);
    	return;
    }

	if (IS_SET(ch->newbits, NEW_FIGHTDANCE)) {
	send_to_char("You will no longer dance The Dance of Lloth.\n\r", ch );
	REMOVE_BIT(ch->newbits, NEW_FIGHTDANCE);
	}
	else {
	send_to_char("You will start dancing The Dance of Lloth while fighting.\n\r", ch );
	SET_BIT(ch->newbits, NEW_FIGHTDANCE);
	}

	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 (ch->power[DISC_DROW_ARAC] < 3 )
    {
	send_to_char("You Need To Get Your Arachnid to 3 for this..\n\r",ch);
    	return;
    }

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

      if (IS_SET(ch->newbits,NEW_DFORM))
      {
	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);
        free_string(ch->morph);
        ch->morph = str_dup("");
        ch->hitroll -= 1000;
        ch->damroll -= 1000;
        ch->armor   += 1000;
        REMOVE_BIT(ch->newbits,NEW_DFORM);
	REMOVE_BIT(ch->newbits,THIRD_HAND);
	REMOVE_BIT(ch->newbits,FOURTH_HAND);
        WAIT_STATE(ch, 7);
        return;   
      }

      else if (!IS_SET(ch->newbits,NEW_DFORM))
      {
	
	act("You mutate into a giant spider.",ch,NULL,NULL,TO_CHAR);
        act("$n mutates into a giant spider.",ch,NULL,NULL,TO_ROOM);
        sprintf(buf,"%s the giant mylochar",ch->name);
        free_string(ch->morph);
        ch->morph = str_dup(buf);
        ch->hitroll += 1000;
        ch->damroll += 1000;
        ch->armor   -= 1000;
        SET_BIT(ch->newbits,NEW_DFORM);
	SET_BIT(ch->newbits,THIRD_HAND);
	SET_BIT(ch->newbits,FOURTH_HAND);
	return;
    }

	return;
}


void do_drowsight(CHAR_DATA *ch, char *argument)
{
	if (IS_NPC(ch)) return;
	
    if (ch->power[DISC_DROW_BAT] < 2 )
    {
	send_to_char("You Need To Get Your Bat to 2 for this..\n\r",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_CLASS(ch, CLASS_BLACK_ASSASSIN)
  && !IS_CLASS(ch, CLASS_STALKER) && !IS_CLASS(ch, CLASS_SHADOWBORN))
 {
	send_to_char("Huh?\n\r", ch );
	return;}

    if (ch->power[DISC_DROW_CAME] < 4 )
    {
	send_to_char("You Need To Get Your Chameleon to 4 for this..\n\r",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)
{
	char buf[MAX_STRING_LENGTH];

	if (IS_NPC(ch)) return;

  if (!IS_CLASS(ch, CLASS_DROW) && !IS_CLASS(ch, CLASS_BLACK_ASSASSIN)
  && !IS_CLASS(ch, CLASS_STALKER) && !IS_CLASS(ch, CLASS_SHADOWBORN))
  {
	send_to_char("Huh?\n\r", ch );
	return;}

	send_to_char("#CThe powers Lloth has bestowed upon you...#n\n\r", ch );
	send_to_char("#B-----------------------------------------#n\n\r", ch );

	if (IS_SET(ch->pcdata->powers[1], DPOWER_SPEED))
	send_to_char("You move quite quickly.\n\r", ch );

	if (IS_SET(ch->pcdata->powers[1], DPOWER_TOUGHSKIN))
	send_to_char("Your skin has been toughened.\n\r", ch );

	if (IS_SET(ch->pcdata->powers[1], DPOWER_DROWFIRE))
	send_to_char("You can call Drowfire upon your enemies.\n\r", ch );

	if (IS_SET(ch->pcdata->powers[1], DPOWER_DARKNESS))
	send_to_char("You can summon a globe of darkness.\n\r", ch );

	if (IS_SET(ch->pcdata->powers[1], DPOWER_DROWSIGHT))
	send_to_char("You can use enhanced sight.\n\r", ch );

	if (IS_SET(ch->pcdata->powers[1], DPOWER_LEVITATION))
	send_to_char("You can levitate in the air.\n\r", ch );

	if (IS_SET(ch->pcdata->powers[1], DPOWER_DROWSHIELD))
	send_to_char("You can shield your aura.\n\r", ch );

	if (IS_SET(ch->pcdata->powers[1], DPOWER_DROWPOISON))
	send_to_char("You have control over deadly poisons.\n\r", ch );

	if (IS_SET(ch->pcdata->powers[1], DPOWER_SHADOWWALK))
	send_to_char("You can walk through the shadows.\n\r", ch );

	if (IS_SET(ch->pcdata->powers[1], DPOWER_GAROTTE)) 
	send_to_char("You have mastered the art of garotte.\n\r", ch );

	if (IS_SET(ch->pcdata->powers[1], DPOWER_DGAROTTE))
	send_to_char("You have dark-enhanced garotte.\n\r", ch );

	if (IS_SET(ch->pcdata->powers[1], DPOWER_ARMS))
	send_to_char("You have extra spidery arms.\n\r", ch );

	if (IS_SET(ch->pcdata->powers[1], DPOWER_DROWHATE))
	send_to_char("You can invoke the hatred of the Drow.\n\r", ch );

	if (IS_SET(ch->pcdata->powers[1], DPOWER_SPIDERFORM))
	send_to_char("You can mutate into a large spider.\n\r", ch );

	if (IS_SET(ch->pcdata->powers[1], DPOWER_WEB))
	send_to_char("You can shoot a spidery web at opponents.\n\r", ch);

	if (IS_SET(ch->pcdata->powers[1], DPOWER_GLAMOUR))
	send_to_char("You can glamourosly change the appearance of items.\n\r", ch );

	if (IS_SET(ch->pcdata->powers[1], DPOWER_CONFUSE))
	send_to_char("You can confuse your enemies during battle.\n\r", ch );

	if (IS_SET(ch->pcdata->powers[1], DPOWER_EARTHSHATTER))
	send_to_char("You can shatter the earth under your feet.\n\r", ch );

	if (IS_SET(ch->pcdata->powers[1], DPOWER_DARKTENDRILS))
	send_to_char("You call forth Tendrils of Darkness to aid battle.\n\r", ch );
	
	if (IS_SET(ch->pcdata->powers[1], DPOWER_FIGHTDANCE))
	send_to_char("You will fight The Dance of Lloth when engaged in battle.\n\r", ch );
	
	send_to_char("\n\r", ch);
	
	if (IS_SET(ch->special, SPC_DROW_WAR))
	send_to_char("You are a Drow Warrior.\n\r", ch);

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

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

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

        sprintf( buf, "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("You feel strong in the night.\n\r", ch );

	send_to_char("\n\r", ch );
	
	return;
}


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

	if (IS_NPC(ch)) return;

  if (!IS_CLASS(ch, CLASS_DROW) && !IS_CLASS(ch, CLASS_BLACK_ASSASSIN)
  && !IS_CLASS(ch, CLASS_STALKER) && !IS_CLASS(ch, CLASS_SHADOWBORN))
    {
  send_to_char("Huh?\n\r",ch);
      return;
    }


  if ((IS_CLASS(ch, CLASS_DROW) || IS_CLASS(ch, CLASS_BLACK_ASSASSIN)
  || IS_CLASS(ch, CLASS_STALKER) || IS_CLASS(ch, CLASS_SHADOWBORN))
  && ch->power[DISC_DROW_RAVE] < 9 )
    {
	send_to_char("You Need To Get Your Raven to 9 for this..\n\r",ch);
    	return;
    }


	if (ch->fight_timer>0) {
	  send_to_char("Not until your fighttimer expires.\n\r",ch);
	  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 (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);
	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];
	char arg3[MAX_STRING_LENGTH];
	OBJ_DATA *obj;

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

	if (IS_NPC(ch)) return;
  if (!IS_CLASS(ch, CLASS_DROW) && !IS_CLASS(ch, CLASS_BLACK_ASSASSIN)
  && !IS_CLASS(ch, CLASS_STALKER) && !IS_CLASS(ch, CLASS_SHADOWBORN))
  {
    send_to_char("Huh?\n\r",ch);
    return;
  }

	if (ch->power[DISC_DROW_CAME] < 2)
  {
    send_to_char("You need your Chameleon to 2 for this\n\r",ch);
    return;
  }


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

	if (!(!str_cmp(arg2,"short") || !str_cmp(arg2,"name")))
        {send_to_char("syntax : glamour <item> <short/name> <newname>.\n\r",ch);
        return;}

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

  if (has_bad_chars(ch, arg3))
  {
    send_to_char("Illegal chars, please retry.\n\r",ch);
    return;
  }

  if (IS_SET(obj->quest, QUEST_ARTIFACT) || IS_SET(obj->quest, QUEST_PRIZE))
  {
    send_to_char("Not on artifacts and prizes.\n\r",ch);
    return;
  }

	if (!str_cmp(arg2,"name"))
        {free_string(obj->name);
	obj->name = str_dup(arg3);
	obj->questmaker = str_dup(ch->name);
	}
	if (!str_cmp(arg2,"short"))
	{free_string(obj->short_descr);
	obj->short_descr=str_dup(arg3);
	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 (ch->power[DISC_DROW_ARAC] < 4 )
    {
	send_to_char("You Need To Get Your Arachnid to 4 for this..\n\r",ch);
    	return;
    }

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

	if (ch->move < 75) {
	send_to_char("You need 75 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 -=75;

	if ( number_percent() > 25 ) {
	send_to_char("You failed.\n\r", ch );
	return;}

	else {
		do_flee(victim,"");	
	WAIT_STATE(ch, 16);
	return;	}

	return;
}


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

	if (IS_NPC(ch)) return;

    if ((IS_CLASS(ch,CLASS_DROW) || IS_CLASS(ch, CLASS_STALKER)
    || IS_CLASS(ch, CLASS_BLACK_ASSASSIN) || IS_CLASS(ch, CLASS_SHADOWBORN))
    &&  ch->power[DISC_DROW_ARAC] < 2 )
    {
	send_to_char("You Need To Get Your Arachnid to 2 for this..\n\r",ch);
    	return;
    }
    if ((IS_CLASS(ch, CLASS_GAIA_WOLF) || IS_CLASS(ch, CLASS_DRUID)
    || IS_CLASS(ch, CLASS_DEVA) || IS_CLASS(ch, CLASS_NECROMANCER)
    || IS_CLASS(ch, CLASS_ELEMENTAL)) && ch->pcdata->powers[ELEMENTAL_EARTH] < 3)
    {
  	  send_to_char("You need your earth to 3 for this.\n\r",ch);
	  return;
    }   
	if (!IS_CLASS(ch, CLASS_ELEMENTAL) && !IS_CLASS(ch, CLASS_DROW))
    {
          send_to_char("You need to be a drow or elemental for this.\n\r",ch);
          return;
    }


	if (ch->mana < 1150) {
	send_to_char("You need more mana.\n\r", ch );
	return;}

	level = ch->spl[PURPLE_MAGIC];
	ch->mana -= 1150;

	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 (vch == ch) continue;
        if (vch->trust>6) continue;
            dam  = dice(level, 80 );
            if ( saves_spell( level, vch ) )
                dam /= 2;
            damage( ch, vch, dam, skill_lookup("earthquake"));
            damage( ch, vch, dam, skill_lookup("earthquake"));
            damage( ch, vch, dam, skill_lookup("earthquake"));
  
  }
	WAIT_STATE(ch, 6);
    return;
}
/*
void do_drowforge( CHAR_DATA *ch, char *argument )
{
  OBJ_DATA *obj;
  if (IS_NPC(ch)) return;
  if (!IS_CLASS(ch, CLASS_DROW))
  {
    send_to_char("Huh?\n\r",ch);
    return;
  }
  if ( 200 > ch->practice)
  {
    send_to_char("It costs 60 points of primal to create a Whip of Lloth.\n\r",ch);
    return;
  }
  ch->practice   -= 60;
  obj = create_object(get_obj_index(OBJ_VNUM_DROWFORGE)  ,0 );
  SET_BIT(obj->quest, QUEST_RELIC);
  obj->value[1] = 30;
  obj->value[2] = 60;
  obj->questowner = str_dup(ch->pcdata->switchname);
  obj->ownerid = ch->pcdata->playerid;
  obj_to_char(obj, ch);
  act("A Sacred Whip of Lloth Appears in Your Hands!",ch,NULL,NULL,TO_CHAR);
  act("A Sacred Whip of Lloth Appears in $n's hands!",ch,NULL,NULL,TO_ROOM);
  return;
}
*/