legend/
legend/area/
legend/player/
/***************************************************************************
 *  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.                                        *
 ***************************************************************************/
/******************************************
 All contents in this file created by Nephesch.
 However, all material is free for use as long as
 you give me some credit. As far as I know this
 is the most accurate coding of the White Wolf
 Fae class. Have fun everyone.
******************************************
* Content Modified By Jalthier Firestar  *
* Some work done by Paithan		 *
******************************************/
#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "merc.h"


void chicanery_art (CHAR_DATA * ch)
{
   if (IS_NPC (ch))
      return;
   stc ("      Chicanery:   ", ch);

   if (ch->pcdata->powers[FAE_CHIC] == 0)
   {
      stc (" None.\n\r", ch);
      return;
   }

   if (ch->pcdata->powers[FAE_CHIC] >= 1)
      stc (" Fuddle", ch);
   if (ch->pcdata->powers[FAE_CHIC] >= 2)
      stc (" Fugue", ch);
   if (ch->pcdata->powers[FAE_CHIC] >= 3)
      stc (" Haunted", ch);
   if (ch->pcdata->powers[FAE_CHIC] >= 4)
      stc (" Veiled", ch);
   if (ch->pcdata->powers[FAE_CHIC] >= 5)
      stc (" Captive", ch);
   stc ("\n\r", ch);
   return;
}

void legerdemain_art (CHAR_DATA * ch)
{
   if (IS_NPC (ch))
      return;
   stc ("      Legerdemain: ", ch);
   if (ch->pcdata->powers[FAE_LEGE] == 0)
   {
      stc (" None.\n\r", ch);
      return;
   }

   if (ch->pcdata->powers[FAE_LEGE] >= 1)
      stc (" Faesight", ch);
   if (ch->pcdata->powers[FAE_LEGE] >= 2)
      stc (" Ensnare", ch);
   if (ch->pcdata->powers[FAE_LEGE] >= 3)
      stc (" Effigy", ch);
   if (ch->pcdata->powers[FAE_LEGE] >= 4)
      stc (" Gimmix", ch);
   if (ch->pcdata->powers[FAE_LEGE] >= 5)
      stc (" Phantom", ch);
   stc ("\n\r", ch);
   return;
}

void primal_art (CHAR_DATA * ch)
{
   if (IS_NPC (ch))
      return;
   stc ("      Primal:      ", ch);
   if (ch->pcdata->powers[FAE_PRIM] == 0)
   {
      stc (" None.\n\r", ch);
      return;
   }

   if (ch->pcdata->powers[FAE_PRIM] >= 1)
      stc (" Willow", ch);
   if (ch->pcdata->powers[FAE_PRIM] >= 2)
      stc (" Heather", ch);
   if (ch->pcdata->powers[FAE_PRIM] >= 3)
      stc (" Oakenshield", ch);
   if (ch->pcdata->powers[FAE_PRIM] >= 4)
      stc (" Holly", ch);
   if (ch->pcdata->powers[FAE_PRIM] >= 5)
      stc (" Elderform", ch);
   stc ("\n\r", ch);
   return;
}

void soothsay_art (CHAR_DATA * ch)
{
   if (IS_NPC (ch))
      return;
   stc ("      Soothsay:    ", ch);
   if (ch->pcdata->powers[FAE_SOOT] == 0)
   {
      stc (" None.\n\r", ch);
      return;
   }

   if (ch->pcdata->powers[FAE_SOOT] >= 1)
      stc (" Viewaura", ch);
   if (ch->pcdata->powers[FAE_SOOT] >= 2)
      stc (" Boil", ch);
   if (ch->pcdata->powers[FAE_SOOT] >= 3)
      stc (" Tattletale", ch);
   if (ch->pcdata->powers[FAE_SOOT] >= 4)
      stc (" Augury", ch);
   if (ch->pcdata->powers[FAE_SOOT] >= 5)
      stc (" Fate", ch);
   stc ("\n\r", ch);
   return;
}

void sovereign_art (CHAR_DATA * ch)
{
   if (IS_NPC (ch))
      return;
   stc ("      Sovereign:   ", ch);
   if (ch->pcdata->powers[FAE_SOVE] == 0)
   {
      stc (" None.\n\r", ch);
      return;
   }

   if (ch->pcdata->powers[FAE_SOVE] >= 1)
      stc (" Protocol", ch);
   if (ch->pcdata->powers[FAE_SOVE] >= 2)
      stc (" Dictum", ch);
   if (ch->pcdata->powers[FAE_SOVE] >= 3)
      stc (" Grandeur", ch);
   if (ch->pcdata->powers[FAE_SOVE] >= 4)
      stc (" Weaver", ch);
   if (ch->pcdata->powers[FAE_SOVE] >= 5)
      stc (" Geasa", ch);
   stc ("\n\r", ch);
   return;
}

void wayfare_art (CHAR_DATA * ch)
{
   if (IS_NPC (ch))
      return;
   stc ("      Wayfare:     ", ch);
   if (ch->pcdata->powers[FAE_WAYF] == 0)
   {
      stc (" None.\n\r", ch);
      return;
   }

   if (ch->pcdata->powers[FAE_WAYF] >= 1)
      stc (" Quicksilver", ch);
   if (ch->pcdata->powers[FAE_WAYF] >= 2)
      stc (" Hopscotch", ch);
   if (ch->pcdata->powers[FAE_WAYF] >= 3)
      stc (" Passage", ch);
   if (ch->pcdata->powers[FAE_WAYF] >= 4)
      stc (" Wind", ch);
   if (ch->pcdata->powers[FAE_WAYF] >= 5)
      stc (" Flicker", ch);
   stc ("\n\r", ch);
   return;
}

void kithpowers (CHAR_DATA * ch)
{
   if (IS_KITH (ch, KITH_SIDHE))
      stc ("      Sidhe:        FaeAwe FaeSteed\n\r", ch);
   if (IS_KITH (ch, KITH_TROLL))
      stc ("      Troll:        Cleave FaeHorns\n\r", ch);
   if (IS_KITH (ch, KITH_REDCAP))
      stc ("      Redcap:       Teeth TeethClench RedClaws\n\r", ch);
   if (IS_KITH (ch, KITH_SATYR))
      stc ("      Satyr:        FaeHorns FaeHooves\n\r", ch);
   if (IS_KITH (ch, KITH_POOKA))
      stc ("      Pooka:        ShapeShift FaeCharm\n\r", ch);
   if (IS_KITH (ch, KITH_SLUAGH))
      stc ("      Sluagh:       Squirm ShadowShade Entrap\n\r", ch);
   if (IS_KITH (ch, KITH_BOGGAN))
      stc ("      Boggan:       CraftArmour\n\r", ch);
   if (IS_KITH (ch, KITH_NOCKER))
      stc ("      Nocker:       PoisonWeapon FreezeWeapon FlameWeapon CraftWeapon\n\r", ch);
   if (IS_KITH (ch, KITH_ESHU))
      stc ("      Eshu:         Cover Sap Silentwalk\n\r", ch);
   stc ("      Other:        ShowCourt FaeEnchant DreamEyes FreeHold DreamTalk\n\r" "                    (NOTE: Type the name of your Kith to transform into your Seeming)\n\r", ch);
}

void do_dreamtalk (CHAR_DATA * ch, char *argument)
{
   char buf[MSL];
   CHAR_DATA *vch;

   if (!IS_CLASS (ch, CLASS_FAE) && !IS_IMMORTAL (ch))
   {
      do_huh (ch, "");
      return;
   }

   if (argument[0] == '\0')
   {
      stc ("Dreamtalk What?\n\r", ch);
      return;
   }
   if (IS_SET (ch->extra2, DEAF_DREAMT))
      REMOVE_BIT (ch->extra2, DEAF_DREAMT);
   if (!IS_NPC (ch) && IS_SET (ch->act, PLR_SILENCE))
   {
      sprintf (buf, "You can't dreamtalk because you are silenced.\n\r");
      send_to_char (buf, ch);
      return;
   }
   if (is_advertisement(argument))
adv_alert(ch, "dreamtalk", argument);
   for (vch = char_list; vch; vch = vch->next)
   {
      if (IS_NPC (vch) || !vch->desc
	  || (!IS_IMMORTAL (vch) && !IS_CLASS (vch, CLASS_FAE)))
	 continue;
      if (IS_SET (vch->extra2, DEAF_DREAMT))
	 continue;
      sprintf (buf, "#B[#b<#cDREAMTALK#b>#B]#w %s: #c%s#n\n\r", PERS2 (ch, vch),
	       bash_color (argument));
      stc (buf, vch);
   }
}
void do_faepowers (CHAR_DATA * ch, char *argument)
{


   if (IS_NPC (ch))
      return;

   if (IS_CLASS (ch, CLASS_FAE))
   {
      stc ("#B[<============================================================================>]#n\n\r", ch);
      cent_to_char ("#w-[ Changeling Powers ]-#n", ch);
      stc ("#B[<============================================================================>]#n\n\r", ch);
      chicanery_art (ch);
      legerdemain_art (ch);
      primal_art (ch);
      soothsay_art (ch);
      sovereign_art (ch);
      wayfare_art (ch);
      kithpowers (ch);
      stc ("#B[<============================================================================>]#n\n\r", ch);
      stc ("\n\rUse the Arts command to learn new powers.\n\r", ch);
      stc ("#B[<============================================================================>]#n\n\r", ch);
      return;
   }
   else
      return;

   return;
}
void do_grandeur (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);
   strcpy (arg2, argument);

   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_FAE))

   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (ch->pcdata->powers[FAE_SOVE] < 3)
   {
      send_to_char
	 ("You must obtain at least level 3 in Sovereign to use Grandeur.\n\r",
	  ch);
      return;
   }

   if (has_timer (ch))
      return;


   if (IS_AFFECTED (ch, AFF_STEELSHIELD))
   {
      REMOVE_BIT (ch->affected_by, AFF_STEELSHIELD);
      act ("You lower your Grandeur.", ch, NULL, NULL, TO_CHAR);
      act ("$n looks less impressive.", ch, NULL, NULL, TO_NOTVICT);
      return;
   }
   if (ch->pcdata->majesty > 0)
   {
      if (ch->pcdata->majesty > 1)
	 sprintf (buf,
		  "You cannot raise your Grandeur for another %d seconds.\n\r",
		  ch->pcdata->majesty);
      else
	 sprintf (buf,
		  "You cannot raise your Grandeur for another 1 second.\n\r");
      send_to_char (buf, ch);
      return;
   }
   SET_BIT (ch->affected_by, AFF_STEELSHIELD);
   act ("You raise your Grandeur.", ch, NULL, NULL, TO_CHAR);
   act ("$n suddenly looks very impressive.", ch, NULL, NULL, TO_NOTVICT);
   ch->pcdata->majesty = 60;
   return;
}
void do_faeawe (CHAR_DATA * ch, char *argument)
{
   if (IS_NPC (ch))
      return;
   if (!IS_CLASS (ch, CLASS_FAE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if ((!IS_SET (ch->kith, KITH_SIDHE)) && ((ch->pcdata->stats[UNI_GEN] > 2)))
   {
      send_to_char ("Only the Sidhe kiths and Gen 2 Fae can use this power.\n\r", ch);
      return;
   }

   if ((IS_CLASS (ch, CLASS_FAE)) && (!IS_SET (ch->kith, KITH_SIDHE)) && ((ch->pcdata->stats[UNI_GEN] > 2)))
   {
      send_to_char ("Only the Sidhe kiths and Gen 2 Fae can use this power.\n\r", ch);
      return;
   }

   if (IS_EXTRA (ch, EXTRA_AWE))
   {
      REMOVE_BIT (ch->extra, EXTRA_AWE);
      send_to_char ("You are no longer Awe Inspiring.\n\r", ch);
      act ("$n is no longer awe inspiring.", ch, NULL, NULL, TO_ROOM);
      return;
   }
   SET_BIT (ch->extra, EXTRA_AWE);
   send_to_char ("You are now Awe Inspiring.\n\r", ch);
   act ("$n is now awe inspiring", ch, NULL, NULL, TO_ROOM);
   return;


}
void do_dictum (CHAR_DATA * ch, char *argument)
{
   char arg1[MAX_INPUT_LENGTH];
   char arg2[MAX_INPUT_LENGTH];
   char buf[MAX_STRING_LENGTH];
   char buffy[MAX_STRING_LENGTH];
   CHAR_DATA *victim;
   int awe;


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

   if (IS_NPC (ch))
      return;
/*    if (!IS_SET(ch->special, SPC_FAE) ) */
/* Jalthier's Test Code */
   if (!IS_CLASS (ch, CLASS_FAE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }

   if (ch->pcdata->powers[FAE_SOVE] < 2)
   {
      send_to_char
	 ("You must obtain at least level 1 in Sovereign to use Dictum.\n\r",
	  ch);
      return;
   }

   if (arg1[0] == '\0' || arg2[0] == '\0')
   {
      send_to_char ("Command whom to do what?\n\r", ch);
      return;
   }

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

   if (victim == ch)
   {
      send_to_char ("How can you command yourself??\n\r", ch);
      return;
   }

   if (!IS_NPC (victim) && victim->level != 3)
   {
      send_to_char ("You can only command other avatars.\n\r", ch);
      return;
   }
   if (IS_CLASS (ch, CLASS_FAE))
   {
      if (ch->pcdata->powers[FAE_SOVE] > 3)
	 awe = 75;
      else if (ch->pcdata->powers[FAE_SOVE] > 4)
	 awe = 100;
      else
	 awe = 25;
   }
   else
      awe = ch->spheres[MMIN] * 20;

   if (IS_EXTRA (ch, EXTRA_AWE))
   {
      awe += 75;
   }

   if (!IS_NPC (victim) && (!IS_HERO (ch) || IS_IMMORTAL (ch)))
   {
      send_to_char ("You can only command other avatars.\n\r", ch);
      return;
   }

   if (ch->pcdata->powers[FAE_SOVE] > 2)
   {
      sprintf (buffy, "%s %s", arg2, argument);
      if (IS_NPC (victim))
	 sprintf (buf, "I think %s wants to %s", victim->short_descr, buffy);
      else if (!IS_NPC (victim) && IS_AFFECTED (victim, AFF_POLYMORPH))
	 sprintf (buf, "I think %s wants to %s", victim->morph, buffy);
      else
	 sprintf (buf, "I think %s wants to %s", victim->name, buffy);
      do_say (ch, buf);
   }
   else
   {
      if (IS_NPC (victim))
	 sprintf (buf, "I think %s wants to %s", victim->short_descr, arg2);
      else if (!IS_NPC (victim) && IS_AFFECTED (victim, AFF_POLYMORPH))
	 sprintf (buf, "I think %s wants to %s", victim->morph, arg2);
      else
	 sprintf (buf, "I think %s wants to %s", victim->name, arg2);
      do_say (ch, buf);
   }

   if (IS_NPC (victim) && victim->level >= awe)
   {
      act ("You shake off $N's suggestion.", victim, NULL, ch, TO_CHAR);
      act ("$n shakes off $N's suggestion.", victim, NULL, ch, TO_NOTVICT);
      act ("$n shakes off your suggestion.", victim, NULL, ch, TO_VICT);
      act ("$s mind is too strong to overcome.", victim, NULL, ch, TO_VICT);
      return;
   }

   else if (victim->spl[BLUE_MAGIC] >= (ch->spl[RED_MAGIC] / 2))
   {
      act ("You shake off $N's suggestion.", victim, NULL, ch, TO_CHAR);
      act ("$n shakes off $N's suggestion.", victim, NULL, ch, TO_NOTVICT);
      act ("$n shakes off your suggestion.", victim, NULL, ch, TO_VICT);
      act ("$s mind is too strong to overcome.", victim, NULL, ch, TO_VICT);
      return;
   }
   if (!str_cmp ("give", arg2))
   {
      send_to_char (" You Failed.\n\r", ch);
      return;
   }
   if (!str_cmp ("dro", arg2))
   {
      send_to_char (" You Failed.\n\r", ch);
      return;
   }
   if (!str_cmp ("drop", arg2))
   {
      send_to_char (" You Failed.\n\r", ch);
      return;
   }
   if (!str_cmp ("gif", arg2))
   {
      send_to_char (" You Failed.\n\r", ch);
      return;
   }
   if (!str_cmp ("giv", arg2))
   {
      send_to_char (" You Failed.\n\r", ch);
      return;
   }
   if (!str_cmp ("gi", arg2))
   {
      send_to_char (" You Failed.\n\r", ch);
      return;
   }
   if (!str_cmp ("gift", arg2))
   {
      send_to_char (" You Failed.\n\r", ch);
      return;
   }
   if (!str_cmp ("c", arg2))
   {
      send_to_char (" You Failed.\n\r", ch);
      return;
   }
   if (!str_cmp ("ca", arg2))
   {
      send_to_char (" You Failed.\n\r", ch);
      return;
   }
   if (!str_cmp ("cas", arg2))
   {
      send_to_char (" You Failed.\n\r", ch);
      return;
   }
   if (!str_cmp ("cast", arg2))
   {
      send_to_char (" You Failed.\n\r", ch);
      return;
   }
   if (!str_cmp ("k", arg2))
   {
      send_to_char (" You Failed.\n\r", ch);
      return;
   }
   if (!str_cmp ("ki", arg2))
   {
      send_to_char (" You Failed.\n\r", ch);
      return;
   }
   if (!str_cmp ("kil", arg2))
   {
      send_to_char (" You Failed.\n\r", ch);
      return;
   }
   if (!str_cmp ("kill", arg2))
   {
      send_to_char (" You Failed.\n\r", ch);
      return;
   }

   if (!str_prefix (arg2, "drop") || !str_prefix (arg2, "sacrifice")
       || !str_prefix (arg2, "cast") || !str_prefix (arg2, "unclaim"))
   {
      send_to_char (" You Failed.\n\r", ch);
      return;
   }

   act ("You blink in confusion.", victim, NULL, NULL, TO_CHAR);
   act ("$n blinks in confusion.", victim, NULL, NULL, TO_ROOM);
   strcpy (buf, "Yes, you're right, I do...");
   do_say (victim, buf);
   if (!IS_NPC(victim)) victim->pcdata->evilchat = ch;
   if (ch->pcdata->powers[FAE_SOVE] > 2)
      interpret (victim, buffy);
   else
      interpret (victim, arg2);
   WAIT_STATE (ch, 24);
   return;

}

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

   one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

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

   if (ch->pcdata->powers[FAE_CHIC] < 5)
   {
      send_to_char
	 ("You must obtain at least level 5 in Chicanery to use Captive Heart.\n\r",
	  ch);
      return;
   }

   if ((familiar = ch->pcdata->familiar) != NULL)
   {
      sprintf (buf, "You break your hold over %s.\n\r",
	       familiar->short_descr);
      send_to_char (buf, ch);
      familiar->wizard = NULL;
      ch->pcdata->familiar = NULL;
      return;
   }

   if (arg[0] == '\0')
   {
      send_to_char ("What do you wish to Possess?\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 ("What an intelligent idea!\n\r", ch);
      return;
   }
   if (victim->level > 150)
   {
      stc ("They are too powerful to control\n\r", ch);
      return;
   }
   if (!IS_NPC (victim))
   {
      send_to_char ("Not on players.\n\r", ch);
      return;
   }

   if (victim->wizard != NULL)
   {
      send_to_char ("You are unable to possess them.\n\r", ch);
      return;
   }

   if (IS_SET (ch->special, SPC_FAE))
      ch->pcdata->familiar = victim;
   victim->wizard = ch;
   act ("You concentrate on $N.", ch, NULL, victim, TO_CHAR);
   act ("$n is staring at you!", ch, NULL, victim, TO_VICT);
   act ("$n starts staring at $N", ch, NULL, victim, TO_NOTVICT);
   return;
}
void do_faesight (CHAR_DATA * ch, char *argument)
{
   if (IS_NPC (ch))
      return;

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

   if (ch->pcdata->powers[FAE_LEGE] < 1)
   {
      send_to_char
	 ("You must obtain at least level 1 in Legerdemain to use Faesight.\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_ensnare (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   char arg[MAX_INPUT_LENGTH];
   char buf[MAX_INPUT_LENGTH];
   int sn;
   int level;
   int spelltype;

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;


   if (!IS_CLASS (ch, CLASS_FAE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (ch->pcdata->powers[FAE_LEGE] < 2)
   {
      send_to_char ("You need level 2 Legerdemain to use Ensnare.\n\r", ch);
      return;
   }
   if (arg[0] == '\0')
   {
      send_to_char ("Who do you wish to use Ensnare on?\n\r", ch);
      return;
   }


   if ((victim = get_char_room (ch, arg)) == NULL)
   {
      send_to_char ("They aren't here.\n\r", ch);
      return;
   }
   if (is_safe (ch, victim) == TRUE)
      return;
   if ((sn = skill_lookup ("infirmity")) < 0)
   {
      sprintf (buf, "Yep, sn is bieng set to %d.", sn);
      send_to_char (buf, ch);
      return;

   }

   spelltype = skill_table[sn].target;
   level = ch->pcdata->powers[FAE_LEGE];
   (*skill_table[sn].spell_fun) (sn, level, ch, victim);
   WAIT_STATE (ch, 12);
   return;
}

void do_passage (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   OBJ_DATA *obj;
   char arg[MAX_INPUT_LENGTH];
   one_argument (argument, arg);

   if (IS_NPC (ch))
      return;
   if (!IS_CLASS (ch, CLASS_FAE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (ch->pcdata->powers[FAE_WAYF] < 3)
   {
      send_to_char ("You require level 3 Wayfare to use portal Passage.\n\r",
		    ch);
      return;
   }
   if (arg[0] == '\0')
   {
      send_to_char ("Who do you wish to create a passage to?\n\r", ch);
      return;
   }

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


   if ((victim == ch)
       || victim->in_room == NULL
       || IS_NPC (victim)
       || (!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)
       || 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;
   }
   if (IS_NPC (victim) && IS_SET (victim->in_room->area->aflags, AFLAG_HQ))
   {
      stc ("You failed.\n\r", ch);
      return;
   }

   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 = 15;
   if (IS_AFFECTED (ch, AFF_SHADOWPLANE))
      obj->extra_flags = ITEM_SHADOWPLANE;
   obj_to_room (obj, ch->in_room);
   FILL_STRING (obj->short_descr, "A swirling mass of Glamour");
   FILL_STRING (obj->name, "rift gate glamour portal");
   FILL_STRING (obj->description,
		"A Swirling mass of #cGlamour#n floats here.\n\r");

   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 = 15;
   if (IS_AFFECTED (victim, AFF_SHADOWPLANE))
      obj->extra_flags = ITEM_SHADOWPLANE;
   obj_to_room (obj, victim->in_room);
   FILL_STRING (obj->short_descr, "A swirling mass of Glamour");
   FILL_STRING (obj->name, "rift gate glamour portal");
   FILL_STRING (obj->description,
		"A Swirling mass of #cGlamour#n floats here.\n\r");
   act ("A look of concentration passes over $n's face.", ch, NULL, NULL,
	TO_ROOM);
   send_to_char ("A look of concentration passes over your face.\n\r", ch);
   act ("$p appears in front of $n in an explosion of magick.", ch, obj, NULL,
	TO_ROOM);
   act ("$p appears in front of you in an explosion of magick.", ch, obj,
	NULL, TO_CHAR);
   act ("$p appears in front of $n in an explosion of magick.", victim, obj,
	NULL, TO_ROOM);
   act ("$p appears in front of you in an explosion of magick", ch, obj,
	victim, TO_VICT);
   return;
}
void do_flicker (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   char arg[MAX_INPUT_LENGTH];

   if (IS_NPC (ch))
      return;

   argument = one_argument (argument, arg);

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

   if (ch->pcdata->powers[FAE_WAYF] < 5)
   {
      send_to_char
	 ("You must obtain at least level 5 in Wayfare to use Flicker Flash.\n\r",
	  ch);
      return;
   }


   if (arg[0] == '\0')
   {
      send_to_char ("Flicker to who?\n\r", ch);
      return;
   }

   if ((victim = get_char_world (ch, arg)) == NULL)
   {
      send_to_char ("They aren't here.\n\r", ch);
      return;
   }
   if (ch->fight_timer > 0)
   {
      stc ("Wait for your fight timer to clear first\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 (!IS_NPC (victim) && !IS_IMMUNE (victim, IMM_SUMMON))
   {
      send_to_char ("He doesnt want you near him!\n\r", ch);
      return;
   }

   if (IS_NPC (victim) && victim->level > 150)
   {
      stc ("You failed\n\r", ch);
      return;
   }
   if (ch == victim)
   {
      send_to_char ("But you're already at yourself!\n\r", ch);
      return;
   }

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

   char_from_room (ch);
   char_to_room (ch, victim->in_room);
   act ("You blink out of existance and appear before $N.", ch, NULL, victim,
	TO_CHAR);
   act ("$n appears in a flash of light before $N.", ch, NULL, victim,
	TO_NOTVICT);
   act ("$n appears in a flash of light in front of you.", ch, NULL, victim,
	TO_VICT);
   do_look (ch, "auto");
   return;
}
void do_hopscotch (CHAR_DATA * ch, char *argument)
{
   char arg[MAX_INPUT_LENGTH];
   CHAR_DATA *victim;

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

   if (IS_CLASS (ch, CLASS_FAE))
   {
      if (ch->pcdata->powers[FAE_WAYF] < 2)
      {
	 send_to_char
	    ("You must obtain at least level 2 in Wayfare to use Hopscotch.\n\r",
	     ch);
	 return;
      }

   }
   else
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (ch->fight_timer > 0)
   {
      stc ("Wait for your fight timer to clear first\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_NPC (victim))
   {
      send_to_char ("Not on NPC's.\n\r", ch);
      return;
   }


   if (!IS_IMMUNE (victim, IMM_SUMMON))
   {
      send_to_char ("I don't think they want you to do that.\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 == ch)
   {
      send_to_char ("Nothing happens.\n\r", ch);
      return;
   }
/*
    if ( victim->level != LEVEL_AVATAR || 
	(!IS_SET(ch->special, SPC_FAE) ))
    {
	send_to_char( "Nothing happens.\n\r", ch );
	return;
    }
*/
   if (victim->in_room == NULL)
   {
      send_to_char ("Nothing happens.\n\r", ch);
      return;
   }

   send_to_char ("You leap into the sky.\n\r", ch);
   act ("$n leaps high into the sky.", ch, NULL, NULL, TO_ROOM);
   char_from_room (ch);
   char_to_room (ch, victim->in_room);
   do_look (ch, "");
   send_to_char ("You come flying in from the sky and land gracefully.\n\r",
		 ch);
   act ("$n comes flying in from the sky and lands gracefully.", ch, NULL,
	NULL, TO_ROOM);
   return;
}
void do_wind (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_FAE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (ch->pcdata->powers[FAE_WAYF] < 4)
   {
      send_to_char
	 ("You must obtain at least level 4 in Wayfare to use Wind Runner.\n\r",
	  ch);
      return;
   }


   if (arg[0] != '\0')
   {
      if (!IS_DEMAFF (ch, DEM_WINGS))
      {
	 send_to_char ("First you better get your wings out!\n\r", ch);
	 return;
      }
      if (!str_cmp (arg, "unfold") || !str_cmp (arg, "u"))
      {
	 if (IS_DEMAFF (ch, DEM_UNFOLDED))
	 {
	    send_to_char ("But your wings are already unfolded!\n\r", ch);
	    return;
	 }
	 send_to_char ("Your wings unfold from behind your back.\n\r", ch);
	 act ("$n's wings unfold from behind $s back.", ch, NULL, NULL,
	      TO_ROOM);
	 SET_BIT (ch->pcdata->powers[DPOWER_CURRENT], DEM_UNFOLDED);
	 return;
      }
      else if (!str_cmp (arg, "fold") || !str_cmp (arg, "f"))
      {
	 if (!IS_DEMAFF (ch, DEM_UNFOLDED))
	 {
	    send_to_char ("But your wings are already folded!\n\r", ch);
	    return;
	 }
	 send_to_char ("Your wings fold up behind your back.\n\r", ch);
	 act ("$n's wings fold up behind $s back.", ch, NULL, NULL, TO_ROOM);
	 REMOVE_BIT (ch->pcdata->powers[DPOWER_CURRENT], DEM_UNFOLDED);
	 return;
      }
      else
      {
	 send_to_char ("Do you want to FOLD or UNFOLD your wings?\n\r", ch);
	 return;
      }
   }

   if (IS_DEMAFF (ch, DEM_WINGS))
   {

      send_to_char ("Your wings slide into your back.\n\r", ch);
      act ("$n's wings slide into $s back.", ch, NULL, NULL, TO_ROOM);
      REMOVE_BIT (ch->pcdata->powers[DPOWER_CURRENT], DEM_WINGS);
      return;
   }
   send_to_char ("Your wings extend from your back.\n\r", ch);
   act ("A pair of wings extend from $n's back.", ch, NULL, NULL, TO_ROOM);
   SET_BIT (ch->pcdata->powers[DPOWER_CURRENT], DEM_WINGS);
   return;
}
void do_augury (CHAR_DATA * ch, char *argument)
{

   if (IS_NPC (ch))
      return;

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

   if (ch->pcdata->powers[FAE_SOOT] < 4)
   {
      stc ("You must obtain level 4 Soothsay to use Augury.\n\r", ch);
      return;
   }

   if (!IS_SET (ch->flag2, AFF2_SPIRITGUARD))
   {
      stc ("You awaken your spirit guardian.\n\r", ch);
      SET_BIT (ch->flag2, AFF2_SPIRITGUARD);
      return;
   }

   else
   {
      stc ("You dismiss your spirit guardian.\n\r", ch);
      REMOVE_BIT (ch->flag2, AFF2_SPIRITGUARD);
      return;
   }
   return;
}
void do_boil (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   char arg[MAX_INPUT_LENGTH];

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

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

   if (ch->pcdata->powers[FAE_SOOT] < 2)
   {
      send_to_char
	 ("You must obtain at level 2 in Soothsay to use Boil and Bubble.\n\r",
	  ch);
      return;
   }


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

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

   if (IS_NPC (victim))
   {
      send_to_char ("Why use Boil on a mob?\n\r", ch);
      return;
   }

   if (IS_IMMORTAL (victim) && victim != ch)
   {
      send_to_char ("You can only use Boil on Avatar's or lower.\n\r", ch);
      return;
   }

   if (is_safe (ch, victim) == TRUE)
      return;

   if (victim->hit < victim->max_hit)
   {
      send_to_char ("They are hurt and suspicious.\n\r", ch);
      return;
   }
   act ("You close your eyes and concentrate on $N.", ch, NULL, victim,
	TO_CHAR);
   act ("$n closes $s eyes and concentrates on you.", ch, NULL, victim,
	TO_VICT);
   act ("$n closes $s eyes and cencentrates on $N.", ch, NULL, victim,
	TO_NOTVICT);
   WAIT_STATE (ch, 12);
   if (number_percent () < 50)
   {
      send_to_char ("You failed.\n\r", ch);
      return;
   }

   act ("Your flesh begins to rot!", victim, NULL, NULL, TO_CHAR);
   act ("$n's flesh begins to rot!", victim, NULL, NULL, TO_ROOM);
   SET_BIT (victim->flag2, AFF2_ROT);
   return;
}

/* To increase powers */

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

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

   if (IS_NPC (ch))
      return;

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

   if (arg1[0] == '\0' && arg2[0] == '\0')
   {
      do_stat (ch, "");
      return;
   }
   if (arg2[0] == '\0')
   {
      if (!str_cmp (arg1, "chicanery"))
      {
	 send_to_char ("Chicanery: The art of trickery and deceit.\n\r", ch);
	 if (ch->pcdata->powers[FAE_CHIC] < 1)
	    send_to_char ("You have none of the Chicanery Arts.\n\r", ch);
	 if (ch->pcdata->powers[FAE_CHIC] > 0)
	    send_to_char
	       ("Captive: You can can take control of others with your mind.\n\r",
		ch);
	 return;
      }
      else if (!str_cmp (arg1, "legerdemain"))
      {
	 send_to_char
	    ("Legerdemain: The art of illusions and slight of hand.\n\r", ch);
	 return;
      }
      else if (!str_cmp (arg1, "primal"))
      {
	 send_to_char ("Primal: The art of power through nature commune.\n\r",
		       ch);
	 return;
      }
      else if (!str_cmp (arg1, "soothsay"))
      {
	 send_to_char ("Soothsay: The art of understanding.\n\r", ch);
	 return;
      }
      else if (!str_cmp (arg1, "sovereign"))
      {
	 send_to_char ("Sovereign: The art of order and control.\n\r", ch);
	 return;
      }

      else if (!str_cmp (arg1, "wayfare"))
      {
	 send_to_char ("Wayfare: The art of traveling and moving.\n\r", ch);
	 return;
      }
      do_stat (ch, "");
      return;

   }
   if (!str_cmp (arg2, "improve"))
   {
      int improve;
      int cost;
      int max;
      int maxlevel = 5;
/*
	stc("Please use the new commands, Disciplines and
research.\n\r",ch);
	return;
*/
/*
	if (ch->[UNI_GEN] == 13)
          maxlevel=5;
         else if (ch->[UNI_GEN] == 12)
          maxlevel=5;
         else if (ch->[UNI_GEN] == 11)
          maxlevel=5;
          else if (ch->[UNI_GEN] == 10)
          maxlevel=5;
          else if (ch->[UNI_GEN] == 9)
          maxlevel=5;
          else if (ch->[UNI_GEN] == 8)
          maxlevel=5;
          else if (ch->[UNI_GEN] == 7)
          maxlevel=5;
        else if (ch->[UNI_GEN] == 6)
          maxlevel=5;
	else if (ch->[UNI_GEN] == 5)
	  maxlevel=5;        
	else if (ch->[UNI_GEN]  == 4)
          maxlevel=5;
        else
         maxlevel=5;
*/
      if (!str_cmp (arg1, "chicanery"))
      {
	 improve = FAE_CHIC;
	 max = maxlevel;
      }
      else if (!str_cmp (arg1, "legerdemain"))
      {
	 improve = FAE_LEGE;
	 max = maxlevel;
      }
      else if (!str_cmp (arg1, "primal"))
      {
	 improve = FAE_PRIM;
	 max = maxlevel;
      }
      else if (!str_cmp (arg1, "soothsay"))
      {
	 improve = FAE_SOOT;
	 max = maxlevel;
      }
      else if (!str_cmp (arg1, "sovereign"))
      {
	 improve = FAE_SOVE;
	 max = maxlevel;
      }
      else if (!str_cmp (arg1, "wayfare"))
      {
	 improve = FAE_WAYF;
	 max = maxlevel;
      }
      else
      {
	 send_to_char
	    ("You can improve: Chicanery, Legerdemain, Primal, Soothsay, Sovereign or Wayfare.\n\r",
	     ch);
	 return;
      }
      cost = (ch->pcdata->powers[improve] + 1) * 10;
      arg1[0] = UPPER (arg1[0]);
      if (ch->pcdata->powers[improve] >= max
	  && ch->pcdata->rank == AGE_METHUSELAH)
      {
	 sprintf (buf,
		  "You have already gained all the powers of the %s art.\n\r",
		  arg1);
	 send_to_char (buf, ch);
	 return;
      }
      if (ch->pcdata->powers[improve] >= max)
      {
	 sprintf (buf, "You have already maxed %s.\n\r", arg1);
	 send_to_char (buf, ch);
	 return;
      }
      if (cost > ch->practice)
      {
	 sprintf (buf, "It costs you %d primal to improve your %sart.\n\r",
		  cost, arg1);
	 send_to_char (buf, ch);
	 return;
      }
      ch->pcdata->powers[improve] += 1;
      ch->practice -= cost;
      sprintf (buf, "You improve your ability in the %s art.\n\r", arg1);
      send_to_char (buf, ch);
   }
   else
      send_to_char ("To improve a art, type: arts <art type> improve.\n\r",
		    ch);
   return;
}

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

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

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

   if (arg[0] == '\0')
   {
      send_to_char ("Enchant 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 (IS_NPC (victim))
   {
      send_to_char ("Not on NPC's.\n\r", ch);
      return;
   }

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

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

   if (IS_CLASS (victim, CLASS_FAE))
   {
      send_to_char ("They are already a Changeling.\n\r", ch);
      return;
   }

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

   if (IS_CLASS (victim, CLASS_VAMPIRE)
       || IS_SET (victim->pcdata->stats[UNI_AFF], VAM_MORTAL))
   {
      send_to_char ("You are unable to enchant vampires!\n\r", ch);
      return;
   }

   if (IS_CLASS (victim, CLASS_MONK))
   {
      send_to_char ("You are unable to enchant monks.\n\r", ch);
      return;
   }

   if (IS_CLASS (victim, CLASS_MAGE))
   {
      send_to_char ("You are unable to enchant mages.\n\r", ch);
      return;
   }

   if (IS_CLASS (victim, CLASS_NINJA))
   {
      send_to_char ("You are unable to enchant ninjas\n\r", ch);
      return;
   }

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

   if (IS_CLASS (victim, CLASS_WEREWOLF))
   {
      send_to_char ("You are unable to enchant werewolves!\n\r", ch);
      return;
   }

   if (IS_CLASS (victim, CLASS_DEMON)
       || IS_SET (victim->special, SPC_CHAMPION))
   {
      send_to_char ("You are unable to enchant demons!\n\r", ch);
      return;
   }


   if (IS_CLASS (victim, CLASS_HIGHLANDER))
   {
      send_to_char ("You are unable to enchant highlanders.\n\r", ch);
      return;
   }

   if (!IS_IMMUNE (victim, IMM_VAMPIRE))
   {
      send_to_char ("You cannot enchant an unwilling person.\n\r", ch);
      return;
   }

   if (victim->exp < 100000)
   {
      send_to_char
	 ("They cannot afford the 100000 exp required to be enchanted by you.\n\r",
	  ch);
      return;
   }

   victim->exp -= 100000;

   act ("You enchant $N bringing them into the Changeling world.", ch, NULL,
	victim, TO_CHAR);
   act ("$n enchants $N bringing them into the Changeling world.", ch, NULL,
	victim, TO_NOTVICT);
   act ("$n enchants you bringing you into the Changeling world.", ch, NULL,
	victim, TO_VICT);
   send_to_char
      ("You are now a Changeling, use 'choose' to pick your kith.\n\r",
       victim);
   free_string (victim->lord);
   victim->lord = str_dup (ch->name);
   victim->class = CLASS_CHOOSE;
   save_char_obj (ch);
   save_char_obj (victim);
   return;
}

void do_choose (CHAR_DATA * ch, char *argument)
{
   char arg1[MAX_INPUT_LENGTH];
   char lord[MIL];

   argument = one_argument (argument, arg1);

   if (IS_NPC (ch))
      return;


   if (!IS_CLASS (ch, CLASS_CHOOSE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   else if (IS_CLASS (ch, CLASS_CHOOSE) && (!str_cmp (arg1, "sidhe")))
   {
      ch->class = CLASS_FAE;
      if (!IS_IMMORTAL (ch));
      ch->level = 3;
      ch->kith = KITH_SIDHE;
      send_to_char ("You are now a Sidhe!\n\r", ch);
   }
   else if (!str_cmp (arg1, "boggan"))
   {
      ch->class = CLASS_FAE;
      if (!IS_IMMORTAL (ch));
      ch->level = 3;
      ch->kith = KITH_BOGGAN;
      send_to_char ("You are now a Boggan!\n\r", ch);
   }
   else if (!str_cmp (arg1, "eshu"))
   {
      ch->class = CLASS_FAE;
      if (!IS_IMMORTAL (ch));
      ch->level = 3;
      ch->kith = KITH_ESHU;
      send_to_char ("You are now an Eshu!\n\r", ch);
   }
   else if (!str_cmp (arg1, "nocker"))
   {
      ch->class = CLASS_FAE;
      if (!IS_IMMORTAL (ch));
      ch->level = 3;
      ch->kith = KITH_NOCKER;
      send_to_char ("You are now a Nocker!\n\r", ch);
   }
   else if (!str_cmp (arg1, "redcap"))
   {
      ch->class = CLASS_FAE;
      if (!IS_IMMORTAL (ch));
      ch->level = 3;
      ch->kith = KITH_REDCAP;
      ch->lord = str_dup (ch->name);
      send_to_char ("You are now a Redcap!\n\r", ch);
   }
   else if (!str_cmp (arg1, "satyr"))
   {
      ch->class = CLASS_FAE;
      if (!IS_IMMORTAL (ch));
      ch->level = 3;
      ch->kith = KITH_SATYR;
      send_to_char ("You are now a Satyr!\n\r", ch);
   }
   else if (!str_cmp (arg1, "sluagh"))
   {
      ch->class = CLASS_FAE;
      ch->level = 3;
      ch->kith = KITH_SLUAGH;
      send_to_char ("You are now a Sluagh!\n\r", ch);
   }
   else if (!str_cmp (arg1, "troll"))
   {
      ch->class = CLASS_FAE;
      if (!IS_IMMORTAL (ch));
      ch->level = 3;
      ch->kith = KITH_TROLL;
      send_to_char ("You are now a Troll!\n\r", ch);
   }
   else if (!str_cmp (arg1, "pooka"))
   {
      ch->class = CLASS_FAE;
      if (!IS_IMMORTAL (ch));
      ch->level = 3;
      ch->kith = KITH_POOKA;
      send_to_char ("You are now a Pooka!\n\r", ch);
   }
   else
   {
      ch->lord = str_dup (lord);
      send_to_char
	 ("Please pick one of the following: Boggan, Eshu, Nocker, Redcap, Satyr, Sidhe, Sluagh, Troll, Pooka.\n\r",
	  ch);
      return;
   }
}

/* More General Fae Powers */
void do_weaver (CHAR_DATA * ch, char *argument)
{

   if (!IS_CLASS (ch, CLASS_FAE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (ch->pcdata->powers[FAE_SOVE] < 4)
   {
      send_to_char ("You need Sovereign 4 to make a weaver ward.\n\r", ch);
      return;
   }
   if (IS_SET (ch->garou1, WW_GRANITE))
   {
      stc ("Your wall of protection fades away.\n\r", ch);
      REMOVE_BIT (ch->garou1, WW_GRANITE);
   }
   else
   {
      stc ("A wall of power arises around your body to protect you.\n\r", ch);
      SET_BIT (ch->garou1, WW_GRANITE);
      return;
   }

   return;
}

/* Troll's cleave skill */

void do_cleave (CHAR_DATA * ch, char *argument)
{
   char arg[MIL];
   CHAR_DATA *vch;
   OBJ_DATA *obj, *obj3;

   if (IS_NPC (ch))
      return;;
   if (!IS_CLASS (ch, CLASS_FAE))
   {
      do_huh (ch, "");
      return;
   }
   if ((!IS_SET (ch->kith, KITH_TROLL)) && ((ch->pcdata->stats[UNI_GEN] > 2)))
   {
      send_to_char ("Only the Troll kiths and Gen 2 Fae can use this power.\n\r", ch);
      return;
   }

   if ((IS_CLASS (ch, CLASS_FAE)) && (!IS_SET (ch->kith, KITH_TROLL)) && ((ch->pcdata->stats[UNI_GEN] > 2)))
   {
      send_to_char ("Only the Troll kiths and Gen 2 Fae can use this power.\n\r", ch);
      return;
   }
   argument = one_argument (argument, arg);
   if (arg[0] == '\0')
   {
      stc ("Whom do you wish to Cleave?\n\r", ch);
      return;
   }
   if ((vch = get_char_room (ch, arg)) == NULL)
   {
      stc ("They aren't here.\n\r", ch);
      return;
   }
   if (ch == vch)
   {
      stc ("Why!?\n\r", ch);
      return;
   }

   if (is_safe (ch, vch))
      return;

   if (IS_NPC(vch) )
   {
	stc("Not on NPCS\n\r", ch);
        return;
   }
   if ((obj = get_eq_char (ch, WEAR_WIELD)) == NULL || obj->item_type != ITEM_WEAPON || (obj->value[3] != 1 && obj->value[3] != 3))
   {
      if ((obj = get_eq_char (ch, WEAR_HOLD)) == NULL || obj->item_type != ITEM_WEAPON || (obj->value[3] != 1 && obj->value[3] != 3))
      {
         if ((obj = get_eq_char (ch, WEAR_DUAL)) == NULL || obj->item_type != ITEM_WEAPON || (obj->value[3] != 1 && obj->value[3] != 3))
         {
            send_to_char ("You need to wield a slashing or slicing weapon to dismember!\n\r", ch);
            return;
         }
      }
   }

   if (IS_ARM_R (vch, LOST_ARM) && IS_ARM_L (vch, LOST_ARM))
   {
      stc ("They have already been dismembered!\n\r", ch);
      return;
   }
   if (number_range (1, 100) < 15)
   {
      if (!IS_ARM_L (vch, LOST_ARM))
	 SET_BIT (vch->loc_hp[2], LOST_ARM);
      if (!IS_BLEEDING (vch, BLEEDING_ARM_L))
	 SET_BIT (vch->loc_hp[6], BLEEDING_ARM_L);
      if ((obj3 = get_eq_char (vch, WEAR_HOLD)) != NULL)
         take_item (vch, obj3);
      if ((obj3 = get_eq_char (vch, WEAR_DUAL)) != NULL)
         take_item (vch, obj3);
      if ((obj3 = get_eq_char (vch, WEAR_HANDS)) != NULL)
         take_item (vch, obj3);
      if ((obj3 = get_eq_char (vch, WEAR_WRIST_L)) != NULL)
         take_item (vch, obj3);
      if ((obj3 = get_eq_char (vch, WEAR_FINGER_L)) != NULL)
         take_item (vch, obj3);
      if ((obj3 = get_eq_char (vch, WEAR_ARMS)) != NULL)
         take_item (vch, obj3);
      make_part (vch, "arm");
      make_part (vch, "arm");
      if (!IS_ARM_R (vch, LOST_ARM))
	 SET_BIT (vch->loc_hp[3], LOST_ARM);
      if (!IS_BLEEDING (vch, BLEEDING_ARM_R))
	 SET_BIT (vch->loc_hp[6], BLEEDING_ARM_R);
      if ((obj3 = get_eq_char (vch, WEAR_WIELD)) != NULL)
         take_item (vch, obj3);
      if ((obj3 = get_eq_char (vch, WEAR_DUAL)) != NULL)
         take_item (vch, obj3);
      if ((obj3 = get_eq_char (vch, WEAR_HANDS)) != NULL)
         take_item (vch, obj3);
      if ((obj3 = get_eq_char (vch, WEAR_WRIST_R)) != NULL)
         take_item (vch, obj3);
      if ((obj3 = get_eq_char (vch, WEAR_FINGER_R)) != NULL)
         take_item (vch, obj3);
      act ("$n has dismembered $N with $p!", ch, obj, vch, TO_NOTVICT);
      act ("You dismember $N with $p!", ch, obj, vch, TO_CHAR);
      act ("$n has dismember you with $p!", ch, obj, vch, TO_VICT);
      WAIT_STATE (ch, 12);
      return;
   }
   stc ("You failed.\n\r", ch);
   WAIT_STATE (ch, 8);

}

/* new fate fire */
void do_fate (CHAR_DATA * ch, char *argument)
{
   if (IS_NPC (ch))
      return;

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

   if (ch->pcdata->powers[FAE_SOOT] < 5)
   {
      send_to_char ("You need level 5 Soothsay to use Fate Fire.\n\r", ch);
      return;
   }

   if (IS_SET (ch->newbits, NEW_MONKFLAME))
   {
      REMOVE_BIT (ch->newbits, NEW_MONKFLAME);
      send_to_char ("Your hands are no longer engulfed by flames.\n\r", ch);
      act ("$n's hands are no longer engulfed by flames.\n\r", ch, NULL, NULL,
	   TO_ROOM);
      return;
   }
   if (!IS_SET (ch->newbits, NEW_MONKFLAME))
   {
      SET_BIT (ch->newbits, NEW_MONKFLAME);
      send_to_char ("Your hands are engulfed by flames!\n\r", ch);
      act ("$n's hands are engulfed by flames!\n\r", ch, NULL, NULL, TO_ROOM);
      return;
   }
}
void do_holly (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   char arg[MIL];
   int dam;
   int i;

   argument = one_argument (argument, arg);

   if (!IS_CLASS (ch, CLASS_FAE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (ch->pcdata->powers[FAE_PRIM] < 4)
   {
      send_to_char ("You need level 4 in Primal to use Holly Strike.\n\r",
		    ch);
      return;
   }
   if (arg[0] == '\0')
   {
      stc ("Whom do you wish to use this on?\n\r", ch);
      return;
   }

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

   if (is_safe (ch, victim))
      return;

   if (IS_SET (ch->affected_by, AFF_SHADOWPLANE) &&
       !IS_SET (victim->affected_by, AFF_SHADOWPLANE))
   {
      stc ("You are too insubstantial!", ch);
      return;
   }
   if (!IS_SET (ch->affected_by, AFF_SHADOWPLANE) &&
       IS_SET (victim->affected_by, AFF_SHADOWPLANE))
   {
      stc ("They are too insubstantial!", ch);
      return;
   }

   if (ch->mana < 3000)
   {
      stc ("You can't afford to summon the holly.\n\r", ch);
      return;
   }


   act ("You summon the warriors plant to strike $N.", ch, NULL, victim,
	TO_CHAR);
   act ("$n points at you and razor sharp holly vines strike you.", ch, NULL,
	victim, TO_VICT);
   {
      for (i = 0; i < number_range (1, 2); i++)
      {
	 dam =
	    number_range ((ch->pcdata->powers[FAE_PRIM] * 750),
			  (ch->pcdata->powers[FAE_PRIM] * 775));
	 mage_damage (ch, victim, dam, "Holly Strike", MAGEDAM_EARTH);
      }
      ch->mana -= 3000;		// Added by seren to make this a hella lot fairer.
   }
   WAIT_STATE (ch, 12);
   return;
}
void do_fugue (CHAR_DATA * ch, char *argument)
{
   char arg[MAX_INPUT_LENGTH];
   CHAR_DATA *victim;

   one_argument (argument, arg);

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

   if (ch->pcdata->powers[FAE_CHIC] < 2)
   {
      stc ("You must obtain level 2 Chicanery to use Fugue.\n\r", ch);
      return;
   }

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

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

   if (victim == ch)
   {
      stc ("Why would you want to read your own mind?\n\r", ch);
      return;
   }

   if (victim->level > ch->level)
   {
      stc ("Their mind is far too powerful for you to read.\n\r", ch);
      return;
   }


   victim->unveil = ch;
   act ("You concentrate deeply upon $N.\n\rYou have invaded $S mind.\n\r",
	ch, NULL, victim, TO_CHAR);
   return;
}
void do_effigy (CHAR_DATA * ch, char *argument)
{
   char arg1[MAX_INPUT_LENGTH];
   OBJ_INDEX_DATA *pObjIndex;
   OBJ_DATA *obj;
   OBJ_DATA *obj2;
   AFFECT_DATA *paf;
   AFFECT_DATA *paf2;

   argument = one_argument (argument, arg1);
   if (IS_NPC (ch))
      return;
   if (!IS_CLASS (ch, CLASS_FAE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (ch->pcdata->powers[FAE_LEGE] < 3)
   {
      send_to_char ("You need Legerdemain 3 to use Effigy.\n\r", ch);
      return;
   }


   if (arg1[0] == '\0')
   {
      send_to_char ("Make a clone of what object?\n\r", ch);
      return;
   }

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

   if (obj->points > 0
       || IS_SET (obj->quest, QUEST_ARTIFACT)
       || IS_SET (obj->quest, QUEST_RELIC)
       || IS_SET (obj->quest, ITEM_EQUEST)
       || obj->item_ver > IV_NORMAL
       || (obj->chobj) != NULL
       || obj->item_type == ITEM_QUEST
       || obj->item_type == ITEM_PIECE
       || obj->item_type == ITEM_QUESTCARD
       || obj->item_type == ITEM_ETOKEN
       || obj->item_type == ITEM_AMMO
       || obj->item_type == ITEM_STOKEN
       || IS_SET (obj->spectype, SITEM_TRANSPORTER)
       || IS_SET (obj->spectype, SITEM_TELEPORTER))

   {

      send_to_char ("You cant clone that object.\n\r", ch);
      return;
   }


   pObjIndex = get_obj_index (obj->pIndexData->vnum);
   obj2 = create_object (pObjIndex, obj->level);
   /* Copy any changed parts of the object. */
   free_string (obj2->name);
   obj2->name = str_dup (obj->name);
   free_string (obj2->short_descr);
   obj2->short_descr = str_dup (obj->short_descr);
   free_string (obj2->description);
   obj2->description = str_dup (obj->description);

   if (obj->questmaker != NULL && strlen (obj->questmaker) > 1)
   {
      free_string (obj2->questmaker);
      obj2->questmaker = str_dup (obj->questmaker);
   }

   if (obj->chpoweron != NULL)
   {
      free_string (obj2->chpoweron);
      obj2->chpoweron = str_dup (obj->chpoweron);
   }
   if (obj->chpoweroff != NULL)
   {
      free_string (obj2->chpoweroff);
      obj2->chpoweroff = str_dup (obj->chpoweroff);
   }
   if (obj->chpoweruse != NULL)
   {
      free_string (obj2->chpoweruse);
      obj2->chpoweruse = str_dup (obj->chpoweruse);
   }
   if (obj->victpoweron != NULL)
   {
      free_string (obj2->victpoweron);
      obj2->victpoweron = str_dup (obj->victpoweron);
   }
   if (obj->victpoweroff != NULL)
   {
      free_string (obj2->victpoweroff);
      obj2->victpoweroff = str_dup (obj->victpoweroff);
   }
   if (obj->victpoweruse != NULL)
   {
      free_string (obj2->victpoweruse);
      obj2->victpoweruse = str_dup (obj->victpoweruse);
   }
   obj2->item_type = obj->item_type;
   obj2->extra_flags = obj->extra_flags;
   obj2->wear_flags = obj->wear_flags;
   obj2->weight = obj->weight;
   obj2->spectype = obj->spectype;
   obj2->specpower = obj->specpower;
   obj2->condition = obj->condition;
   obj2->toughness = obj->toughness;
   obj2->resistance = obj->resistance;
   obj2->quest = obj->quest;
   obj2->points = obj->points;
   obj2->cost = obj->cost;
   obj2->value[0] = obj->value[0];
   obj2->value[1] = obj->value[1];
   obj2->value[2] = obj->value[2];
   obj2->value[3] = obj->value[3];
    /*****************************************/
   obj_to_char (obj2, ch);

   if (obj->affected != NULL)
   {
      for (paf = obj->affected; paf != NULL; paf = paf->next)
      {
	 if (affect_free == NULL)
	    paf2 = alloc_perm (sizeof (*paf));
	 else
	 {
	    paf2 = affect_free;
	    affect_free = affect_free->next;
	 }
	 paf2->type = 0;
	 paf2->duration = paf->duration;
	 paf2->location = paf->location;
	 paf2->modifier = paf->modifier;
	 paf2->bitvector = 0;
	 paf2->next = obj2->affected;
	 obj2->affected = paf2;
      }
   }
   obj2->timer = ch->pcdata->powers[FAE_LEGE] * 2;
   SET_BIT (obj2->quest, QUEST_CLONED);
   act ("A replica of $p appears in your hands in a flash of glamour.", ch,
	obj, NULL, TO_CHAR);
   act ("A replica of $p appears in $n's hands in a flash of glamour.", ch,
	obj, NULL, TO_ROOM);
   if (obj->questmaker != NULL)
      free_string (obj->questmaker);
   obj->questmaker = str_dup (ch->name);
   WAIT_STATE (ch, 16);
   return;
}
void do_fuddle (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   char buf[MAX_INPUT_LENGTH];

   if (IS_NPC (ch))
      return;

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

   if (is_inarena (ch))
   {
      stc ("Not while in the arena!\n\r", ch);
      return;
   }

   if (ch->pcdata->powers[FAE_CHIC] < 1)
   {
      stc ("You must obtain level 1 Chicanery to use fuddle.\n\r", ch);
      return;
   }

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

   ch->pcdata->followers++;


   victim = create_mobile (get_mob_index (30001));
   victim->short_descr = str_dup (ch->name);
   sprintf (buf, "%s is hovering here.\n\r", ch->name);
   victim->long_descr = str_dup (buf);
   victim->name = str_dup (ch->name);
   victim->level = 200;
   victim->max_hit = ch->max_hit;
   victim->hit = victim->max_hit;
   victim->max_mana = ch->max_mana;
   victim->mana = victim->max_mana;
   victim->max_move = ch->max_move;
   victim->move = victim->max_move;
   victim->hitroll = ch->hitroll;
   victim->damroll = ch->damroll;
   SET_BIT (victim->flag2, VAMP_CLONE);
   SET_BIT (victim->act, ACT_NOEXP);
   char_to_room (victim, ch->in_room);
   act ("You twiddle your fingers and in a flash of pure glamour you split in two.", ch, NULL, victim, TO_CHAR);
   act ("$n twiddles $s fingers and splits in two in a flash of glamour.", ch,
	NULL, victim, TO_ROOM);
   return;

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

   one_argument (argument, arg);

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

   if (ch->pcdata->powers[FAE_LEGE] < 4)
   {
      stc ("You must obtain level 4 Legerdemain to use Gimmix.\n\r", ch);
      return;
   }

   if (arg[0] == '\0')
   {
      send_to_char ("Which illusion do you wish to control?\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 ("Become your own familiar? thats kinda dumb.\n\r", ch);
      return;
   }

   if (!IS_NPC (victim))
   {
      stc ("Not on players.\n\r", ch);
      return;
   }

   if (!IS_SET (victim->flag2, VAMP_CLONE))
   {
      stc ("That is not a clone.\n\r", ch);
      return;
   }

   if ((familiar = ch->pcdata->familiar) != NULL)
      familiar->wizard = NULL;
   ch->pcdata->familiar = victim;
   victim->wizard = ch;
   act ("You take control of $N's mind.", ch, NULL, victim, TO_CHAR);
   act ("$n takes control of $N's mind.", ch, NULL, victim, TO_ROOM);

   return;
}

/* Boggan Seeming - Fae battle forms and true visages */
void do_boggan (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_FAE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (!IS_SET (ch->kith, KITH_BOGGAN))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }

   if (IS_SET (ch->special, SPC_SEEMING))
   {
      REMOVE_BIT (ch->special, SPC_SEEMING);
      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 change your seeming when changed.\n\r", ch);
      return;
   }


   if (!IS_SET (ch->special, SPC_SEEMING))
   {
      if (ch->stance[0] != -1)
	 do_stance (ch, "");
      act ("You change into your Changeling Seeming.", ch, NULL, NULL,
	   TO_CHAR);
      act ("$n's body twists and turns into a Boggan.", ch, NULL, NULL,
	   TO_ROOM);

      SET_BIT (ch->special, SPC_SEEMING);
      sprintf (buf, "%s a short stocky boggan", ch->name);
      free_string (ch->morph);
      ch->morph = str_dup (buf);
      return;
   }
}

/* Eshu Seeming - Fae battle forms and true visages */
void do_eshu (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_FAE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (!IS_SET (ch->kith, KITH_ESHU))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }

   if (IS_SET (ch->special, SPC_SEEMING))
   {
      REMOVE_BIT (ch->special, SPC_SEEMING);
      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 change your seeming when changed.\n\r", ch);
      return;
   }


   if (!IS_SET (ch->special, SPC_SEEMING))
   {
      if (ch->stance[0] != -1)
	 do_stance (ch, "");
      act ("You change into your Changeling Seeming.", ch, NULL, NULL,
	   TO_CHAR);
      act ("$n's body twists and turns into an Eshu.", ch, NULL, NULL,
	   TO_ROOM);

      SET_BIT (ch->special, SPC_SEEMING);
      sprintf (buf, "%s a dark an alluring eshu", ch->name);
      free_string (ch->morph);
      ch->morph = str_dup (buf);
      return;
   }
}

/* Nocker Seeming - Fae battle forms and true visages */
void do_nocker (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_FAE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (!IS_SET (ch->kith, KITH_NOCKER))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }

   if (IS_SET (ch->special, SPC_SEEMING))
   {
      REMOVE_BIT (ch->special, SPC_SEEMING);
      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 change your seeming when changed.\n\r", ch);
      return;
   }


   if (!IS_SET (ch->special, SPC_SEEMING))
   {
      if (ch->stance[0] != -1)
	 do_stance (ch, "");
      act ("You change into your Changeling Seeming.", ch, NULL, NULL,
	   TO_CHAR);
      act ("$n's body twists and turns into a Nocker.", ch, NULL, NULL,
	   TO_ROOM);

      SET_BIT (ch->special, SPC_SEEMING);
      sprintf (buf, "%s a skinny red-faced nocker", ch->name);
      free_string (ch->morph);
      ch->morph = str_dup (buf);
      return;
   }
}

/* Pooka Seeming - Fae battle forms and true visages */
void do_pooka (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_FAE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (!IS_SET (ch->kith, KITH_POOKA))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }


   if (IS_SET (ch->special, SPC_SEEMING))
   {
      REMOVE_BIT (ch->special, SPC_SEEMING);
      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 change your seeming when changed.\n\r", ch);
      return;
   }


   if (!IS_SET (ch->special, SPC_SEEMING))
   {
      if (ch->stance[0] != -1)
	 do_stance (ch, "");
      act ("You change into your Changeling Seeming.", ch, NULL, NULL,
	   TO_CHAR);
      act ("$n's body twists and turns into a Pooka.", ch, NULL, NULL,
	   TO_ROOM);

      SET_BIT (ch->special, SPC_SEEMING);
      sprintf (buf, "%s a cute pooka", ch->name);
      free_string (ch->morph);
      ch->morph = str_dup (buf);
      return;
   }
}

/* Redcap Seeming - Fae battle forms and true visages */
void do_redcap (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_FAE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (!IS_SET (ch->kith, KITH_REDCAP))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }

   if (IS_SET (ch->special, SPC_SEEMING))
   {
      REMOVE_BIT (ch->special, SPC_SEEMING);
      act ("You transform into human form.", ch, NULL, NULL, TO_CHAR);
      act ("$n's shrinks back into human form.", ch, NULL, NULL, TO_ROOM);
      REMOVE_BIT (ch->pcdata->stats[UNI_AFF], VAM_FANGS);
      free_string (ch->morph);
      ch->morph = str_dup ("");
      return;
   }
   else if (IS_AFFECTED (ch, AFF_POLYMORPH))
   {
      send_to_char ("You cant change your seeming when changed.\n\r", ch);
      return;
   }


   if (!IS_SET (ch->special, SPC_SEEMING))
   {
      if (ch->stance[0] != -1)
	 do_stance (ch, "");
      act ("You change into your Changeling Seeming.", ch, NULL, NULL,
	   TO_CHAR);
      act ("$n's body twists and turns into a Redcap.", ch, NULL, NULL,
	   TO_ROOM);

      SET_BIT (ch->special, SPC_SEEMING);
      if (!str_cmp (ch->name, "Nephesch"))
	 sprintf (buf, "Nephesch the Redcap");
      sprintf (buf, "%s a pale menacing redcap", ch->name);
      free_string (ch->morph);
      SET_BIT (ch->pcdata->stats[UNI_AFF], VAM_FANGS);
      ch->morph = str_dup (buf);
      return;
   }
}

/* Satyr Seeming - Fae battle forms and true visages */
void do_satyr (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_FAE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (!IS_SET (ch->kith, KITH_SATYR))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }

   if (IS_SET (ch->special, SPC_SEEMING))
   {
      REMOVE_BIT (ch->special, SPC_SEEMING);
      act ("You transform into human form.", ch, NULL, NULL, TO_CHAR);
      act ("$n's shrinks back into human form.", ch, NULL, NULL, TO_ROOM);
      REMOVE_BIT (ch->pcdata->powers[DPOWER_CURRENT], DEM_HORNS);
      REMOVE_BIT (ch->pcdata->powers[DPOWER_CURRENT], DEM_HOOVES);
      free_string (ch->morph);
      ch->morph = str_dup ("");
      return;
   }
   else if (IS_AFFECTED (ch, AFF_POLYMORPH))
   {
      send_to_char ("You cant change your seeming when changed.\n\r", ch);
      return;
   }


   if (!IS_SET (ch->special, SPC_SEEMING))
   {
      if (ch->stance[0] != -1)
	 do_stance (ch, "");
      act ("You change into your Changeling Seeming.", ch, NULL, NULL,
	   TO_CHAR);
      act ("$n's body twists and turns into a Satyr.", ch, NULL, NULL,
	   TO_ROOM);

      SET_BIT (ch->special, SPC_SEEMING);
      sprintf (buf, "%s an attractive horned satyr", ch->name);
      free_string (ch->morph);
      ch->morph = str_dup (buf);
      SET_BIT (ch->pcdata->powers[DPOWER_CURRENT], DEM_HORNS);
      SET_BIT (ch->pcdata->powers[DPOWER_CURRENT], DEM_HOOVES);
      return;
   }
}

/* Sidhe Seeming - Fae battle forms and true visages */
void do_sidhe (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_FAE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (!IS_SET (ch->kith, KITH_SIDHE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }

   if (IS_SET (ch->special, SPC_SEEMING))
   {
      REMOVE_BIT (ch->special, SPC_SEEMING);
      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 change your seeming when changed.\n\r", ch);
      return;
   }


   if (!IS_SET (ch->special, SPC_SEEMING))
   {
      if (ch->stance[0] != -1)
	 do_stance (ch, "");
      act ("You change into your Changeling Seeming.", ch, NULL, NULL,
	   TO_CHAR);
      act ("$n's body twists and turns into a Sidhe.", ch, NULL, NULL,
	   TO_ROOM);

      SET_BIT (ch->special, SPC_SEEMING);
      sprintf (buf, "%s a tall gorgeous sidhe", ch->name);
      free_string (ch->morph);
      ch->morph = str_dup (buf);
      return;
   }
}

void do_sluagh (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_FAE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (!IS_SET (ch->kith, KITH_SLUAGH))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }

   if (IS_SET (ch->special, SPC_SEEMING))
   {
      REMOVE_BIT (ch->special, SPC_SEEMING);
      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 change your seeming when changed.\n\r", ch);
      return;
   }


   if (!IS_SET (ch->special, SPC_SEEMING))
   {
      if (ch->stance[0] != -1)
	 do_stance (ch, "");
      act ("You change into your Changeling Seeming.", ch, NULL, NULL,
	   TO_CHAR);
      act ("$n's body twists and turns into a Sluagh.", ch, NULL, NULL,
	   TO_ROOM);

      SET_BIT (ch->special, SPC_SEEMING);
      sprintf (buf, "%s a dark and hideous sluagh", ch->name);
      free_string (ch->morph);
      ch->morph = str_dup (buf);
      return;
   }
}


/* Troll Seeming - Fae battle forms and true visages */
void do_troll (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_FAE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (!IS_SET (ch->kith, KITH_TROLL))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }

   if (IS_SET (ch->special, SPC_SEEMING))
   {
      REMOVE_BIT (ch->special, SPC_SEEMING);
      act ("You transform into human form.", ch, NULL, NULL, TO_CHAR);
      act ("$n's shrinks back into human form.", ch, NULL, NULL, TO_ROOM);
      REMOVE_BIT (ch->pcdata->powers[DPOWER_CURRENT], DEM_HORNS);
      free_string (ch->morph);
      ch->morph = str_dup ("");
      return;
   }
   else if (IS_AFFECTED (ch, AFF_POLYMORPH))
   {
      send_to_char ("You cant change your seeming when changed.\n\r", ch);
      return;
   }


   if (!IS_SET (ch->special, SPC_SEEMING))
   {
      if (ch->stance[0] != -1)
	 do_stance (ch, "");
      act ("You change into your Changeling Seeming.", ch, NULL, NULL,
	   TO_CHAR);
      act ("$n's body twists and turns into a Troll.", ch, NULL, NULL,
	   TO_ROOM);

      SET_BIT (ch->special, SPC_SEEMING);
      sprintf (buf, "%s A massive horned troll", ch->name);
      free_string (ch->morph);
      SET_BIT (ch->pcdata->powers[DPOWER_CURRENT], DEM_HORNS);
      ch->morph = str_dup (buf);
      return;
   }
}

/* Redcaps Teeth */
void do_teeth (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_FAE));
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if ((!IS_SET (ch->kith, KITH_REDCAP)) && ((ch->pcdata->stats[UNI_GEN] > 2)))
   {
      send_to_char ("Only the Redcap kiths and Gen 2 Fae can use this power.\n\r", ch);
      return;
   }

   if ((IS_CLASS (ch, CLASS_FAE)) && (!IS_SET (ch->kith, KITH_REDCAP)) && ((ch->pcdata->stats[UNI_GEN] > 2)))
   {
      send_to_char ("Only the Redcap kiths and Gen 2 Fae can use this power.\n\r", ch);
      return;
   }


   if (IS_VAMPAFF (ch, VAM_FANGS))
   {
      send_to_char ("Your teeth turn back to normal.\n\r", ch);
      act ("$n's teeth turn back to normal.", ch, NULL, NULL, TO_ROOM);
      REMOVE_BIT (ch->pcdata->stats[UNI_AFF], VAM_FANGS);
      return;
   }
   send_to_char ("Your teeth grow to points and turn sickly yellow.\n\r", ch);
   act ("$n's teeth grow to points and become sickly yellow.", ch, NULL, NULL,
	TO_ROOM);
   SET_BIT (ch->pcdata->stats[UNI_AFF], VAM_FANGS);
   return;
}
void do_dreameyes (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_FAE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }

   if (IS_AFFECTED (ch, AFF_SHADOWSIGHT))
   {
      send_to_char ("You can no longer see into the Umbra.\n\r", ch);
      REMOVE_BIT (ch->affected_by, AFF_SHADOWSIGHT);
      return;
   }
   send_to_char ("You can now see into the Umbra.\n\r", ch);
   SET_BIT (ch->affected_by, AFF_SHADOWSIGHT);
   return;
}
void do_faehorns (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_FAE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }

/*
   if (((!IS_SET (ch->kith, KITH_SATYR)) || (!IS_SET (ch->kith, KITH_TROLL))) && ((ch->pcdata->stats[UNI_GEN] > 2)))
   {
      send_to_char ("Only the Satyr, Troll kiths and Gen 2 Fae can use this power.\n\r", ch);
      return;
   }
*/

//   if ((IS_CLASS (ch, CLASS_FAE)) && ((!IS_SET (ch->kith, KITH_SATYR)) || (!IS_SET (ch->kith, KITH_TROLL))) && ((ch->pcdata->stats[UNI_GEN] > 2)))
    if (!IS_SET(ch->kith, KITH_SATYR) && !IS_SET(ch->kith, KITH_TROLL))
   {
      send_to_char ("Only the Satyr, Troll kiths and Gen 2 Fae can use this power.\n\r", ch);
      return;
   }

   if (IS_DEMAFF (ch, DEM_HORNS))
   {
      send_to_char ("Your horns slide back into your head.\n\r", ch);
      act ("$n's horns slide back into $s head.", ch, NULL, NULL, TO_ROOM);
      REMOVE_BIT (ch->pcdata->powers[DPOWER_CURRENT], DEM_HORNS);
      return;
   }
   send_to_char ("Your horns extend out of your head.\n\r", ch);
   act ("A pair of pointed horns extend from $n's head.", ch, NULL, NULL,
	TO_ROOM);
   SET_BIT (ch->pcdata->powers[DPOWER_CURRENT], DEM_HORNS);
   return;
}
void do_faehooves (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_FAE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if ((!IS_SET (ch->kith, KITH_SATYR)) && ((ch->pcdata->stats[UNI_GEN] > 2)))
   {
      send_to_char ("Only the Satyr kiths and Gen 2 Fae can use this power.\n\r", ch);
      return;
   }

   if ((IS_CLASS (ch, CLASS_FAE)) && (!IS_SET (ch->kith, KITH_SATYR)) && ((ch->pcdata->stats[UNI_GEN] > 2)))
   {
      send_to_char ("Only the Satyr kiths and Gen 2 Fae can use this power.\n\r", ch);
      return;
   }


   if (IS_DEMAFF (ch, DEM_HOOVES))
   {
      send_to_char ("Your hooves transform into feet.\n\r", ch);
      act ("$n's hooves transform back into $s feet.", ch, NULL, NULL,
	   TO_ROOM);
      REMOVE_BIT (ch->pcdata->powers[DPOWER_CURRENT], DEM_HOOVES);
      return;
   }
   send_to_char ("Your feet transform into hooves.\n\r", ch);
   act ("$n's feet transform into hooves.", ch, NULL, NULL, TO_ROOM);
   SET_BIT (ch->pcdata->powers[DPOWER_CURRENT], DEM_HOOVES);
   return;
}

/* Pooka's shapeshift -BUGGED (fixed by Unique) */
void do_shapeshift (CHAR_DATA * ch, char *argument)
{
   char arg[MIL];
   char buf[MSL];
   int choice = 0;

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_FAE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if ((!IS_SET (ch->kith, KITH_POOKA)) && ((ch->pcdata->stats[UNI_GEN] > 2)))
   {
      send_to_char ("Only the Pooka kiths and Gen 2 Fae can use this power.\n\r", ch);
      return;
   }

   if ((IS_CLASS (ch, CLASS_FAE)) && (!IS_SET (ch->kith, KITH_POOKA)) && ((ch->pcdata->stats[UNI_GEN] > 2)))
   {
      send_to_char ("Only the Pooka kiths and Gen 2 Fae can use this power.\n\r", ch);
      return;
   }


   if (arg[0] == '\0')
   {
      divide_to_char (ch);
      centre_text ("Forms", ch);
      divide_to_char (ch);
      stc ("    [ 0 ]  Human\n", ch);
      stc ("    [ 1 ]  Bunny\n", ch);
      stc ("    [ 2 ]  Fox\n", ch);
      stc ("    [ 3 ]  Raven\n", ch);
      stc ("    [ 4 ]  Cat\n", ch);
      stc ("    [ 5 ]  Dog\n", ch);
      stc ("    [ 6 ]  Ferret\n", ch);
      stc ("    [ 7 ]  Mouse\n", ch);
      stc ("    [ 8 ]  Yak\n", ch);
      divide_to_char (ch);
      return;
   }

   choice = is_number (arg) ? atoi (arg) : -1;

   if (choice == 1)
   {
      sprintf (buf, "%s the cute little bunny", ch->name);
      stc ("You transform into a bunny.\n\r", ch);
      act ("$n transforms into a bunny.", ch, NULL, NULL, TO_ROOM);
   }
   else if (choice == 2)
   {
      sprintf (buf, "%s the brown fox", ch->name);
      stc ("You transform into a fox.\n\r", ch);
      act ("$n transforms into a fox.", ch, NULL, NULL, TO_ROOM);
   }
   else if (choice == 3)
   {
      sprintf (buf, "%s the black raven", ch->name);
      stc ("You transform into a raven.\n\r", ch);
      act ("$n transforms into a raven.", ch, NULL, NULL, TO_ROOM);
   }
   else if (choice == 4)
   {
      sprintf (buf, "%s the tiny kitten", ch->name);
      stc ("You transform into a kitten.\n\r", ch);
      act ("$n transforms into a kitten.", ch, NULL, NULL, TO_ROOM);
   }
   else if (choice == 5)
   {
      sprintf (buf, "%s the small hairy dog", ch->name);
      stc ("You transform into a small dog.\n\r", ch);
      act ("$n transforms into a dog.", ch, NULL, NULL, TO_ROOM);
   }
   else if (choice == 6)
   {
      sprintf (buf, "%s the cute little ferret", ch->name);
      stc ("You transform into a ferret.\n\r", ch);
      act ("$n transforms into a ferret.", ch, NULL, NULL, TO_ROOM);
   }
   else if (choice == 7)
   {
      sprintf (buf, "%s the tiny white mouse", ch->name);
      stc ("You transform into a white mouse.\n\r", ch);
      act ("$n transforms into a white mouse.", ch, NULL, NULL, TO_ROOM);
   }
   else if (choice == 8)
   {
      sprintf (buf, "%s the big fat yak", ch->name);
      stc ("You transform into a yak.\n\r", ch);
      act ("$n transforms into a yak.", ch, NULL, NULL, TO_ROOM);
   }
   else if (choice == 0)
   {
      if (IS_AFFECTED (ch, AFF_POLYMORPH))
      {
	 REMOVE_BIT (ch->affected_by, AFF_POLYMORPH);
	 REMOVE_BIT (ch->mflags, MAGE_SHAPED);
	 free_string (ch->morph);
	 ch->morph = str_dup ("");
	 stc ("You revert to your human form.\n\r", ch);
	 act ("$n reverts to $s human form.", ch, NULL, NULL, TO_ROOM);
	 return;
      }
/*
   if (IS_SET (ch->special, SPC_SEEMING))
   {
      REMOVE_BIT (ch->special, SPC_SEEMING);
      act ("You transform into human form.", ch, NULL, NULL, TO_CHAR);
      act ("$n's shrinks back into human form.", ch, NULL, NULL, TO_ROOM);
      ch->max_hit = ch->max_hit - 1500;
      ch->hit = ch->hit - 1500;
      if (ch->hit < 1)
	 ch->hit = 1;
      ch->damroll = ch->damroll - 100;
      ch->hitroll = ch->hitroll - 300;
      free_string (ch->morph);
      ch->morph = str_dup ("");
      return;
   }
   if (IS_SET (ch->extra2, EXTRA2_WYRM))
   {
      REMOVE_BIT (ch->extra2, EXTRA2_WYRM);
      act ("You leave the Elder Form.", ch, NULL, NULL, TO_CHAR);
      act ("$n leaves the Elder Form.", ch, NULL, NULL, TO_ROOM);
      REMOVE_BIT (ch->extra2, EXTRA2_FAEMIGHT);
      REMOVE_BIT (ch->extra2, EXTRA2_FAETOUGH);
      if (ch->hit < 1)
	 ch->hit = 1;
      clear_stats (ch);
      return;
   }
*/
      else
      {
	 stc ("You aren't even shapechanged!\n\r", ch);
	 return;
      }
   }
   else
   {
      stc ("That's not a choice!\n\r", ch);
      do_shapechange (ch, "");
      return;
   }

   SET_BIT (ch->affected_by, AFF_POLYMORPH);
   SET_BIT (ch->mflags, MAGE_SHAPED);
   clear_stats (ch);
   free_string (ch->morph);
   ch->morph = str_dup (buf);
   return;
}

/* Pooka's shapeshift -BUGGED */
/* void do_shapeshift( CHAR_DATA *ch, char *argument )
{
  char arg[MIL];
  char buf[MSL];
  int choice = 0;

  argument = one_argument( argument, arg );

  if ( IS_NPC(ch) ) return;

    if (!IS_CLASS(ch, CLASS_FAE))
    {
	send_to_char("Huh?\n\r",ch);
	return;
    }
    if (!IS_SET(ch->kith, KITH_POOKA))
    {
	send_to_char("Huh?\n\r", ch );
	return;
    }

  if ( arg[0] == '\0' )
  {
    divide_to_char(ch);
    centre_text("Forms",ch);
    divide_to_char(ch);
    stc("    [ 0 ]  Human\n",ch);
    stc("    [ 1 ]  Bunny\n",ch);
    stc("    [ 2 ]  Fox\n",ch);
    stc("    [ 3 ]  Raven\n",ch);
    stc("    [ 4 ]  Cat\n",ch);
    stc("    [ 5 ]  Dog\n",ch);
    stc("    [ 6 ]  Ferret\n",ch);
    stc("    [ 7 ]  Mouse\n",ch);
    stc("    [ 8 ]  Yak\n",ch);
    divide_to_char(ch);
    return;
  }

  choice = is_number( arg ) ? atoi( arg ) : -1;

  if ( choice == 1 )
  {
    sprintf(buf, "A cute little bunny",ch->name);
    stc("You transform into a bunny.\n\r",ch);
    act("$n transforms into a bunny.",ch,NULL,NULL,TO_ROOM);
  }
  else if ( choice == 2 )
  {
    sprintf(buf, "A brown fox",ch->name);
    stc("You transform into a fox.\n\r",ch);
    act("$n transforms into a fox.",ch,NULL,NULL,TO_ROOM);
  }
  else if ( choice == 3 )
  {
    sprintf(buf, "A black raven",ch->name);
    stc("You transform into a raven.\n\r",ch);
    act("$n transforms into a raven.",ch,NULL,NULL,TO_ROOM);
  }
  else if ( choice == 4 )
  {
    sprintf(buf, "A tiny kitten",ch->name);
    stc("You transform into a kitten.\n\r",ch);
    act("$n transforms into a kitten.",ch,NULL,NULL,TO_ROOM);
  }
  else if ( choice == 5 )
  {
    sprintf(buf, "A small hairy dog",ch->name);
    stc("You transform into a small dog.\n\r",ch);
    act("$n transforms into a dog.",ch,NULL,NULL,TO_ROOM);
  }
  else if ( choice == 6 )
  {
    sprintf(buf, "A cute little ferret",ch->name);
    stc("You transform into a ferret.\n\r",ch);
    act("$n transforms into a ferret.",ch,NULL,NULL,TO_ROOM);
  }
  else if ( choice == 7 )
  {
    sprintf(buf, "A tiny white mouse",ch->name);
    stc("You transform into a white mouse.\n\r",ch);
    act("$n transforms into a white mouse.",ch,NULL,NULL,TO_ROOM);
  }
  else if ( choice == 8 )
  {
    sprintf(buf, "A big fat yak",ch->name);
    stc("You transform into a yak.\n\r",ch);
    act("$n transforms into a yak.",ch,NULL,NULL,TO_ROOM);
  }
  else if ( choice == 0 )
  {
    if ( IS_AFFECTED(ch, AFF_POLYMORPH) )
    {
      REMOVE_BIT(ch->affected_by, AFF_POLYMORPH);
      REMOVE_BIT(ch->mflags, MAGE_SHAPED);
      free_string(ch->morph);
      ch->morph = str_dup("");
      stc("You revert to your human form.\n\r",ch);
      act("$n reverts to $s human form.",ch,NULL,NULL,TO_ROOM);
      return;
    }
    else
    {
      stc("You aren't even shapechanged!\n\r",ch);
      return;
    }
  }
  else
  {
    stc("That's not a choice!\n\r",ch);
    do_shapechange(ch,"");
    return;
  }

  SET_BIT(ch->affected_by, AFF_POLYMORPH);
  SET_BIT(ch->mflags, MAGE_SHAPED);
  clear_stats(ch);
  free_string(ch->morph);
  ch->morph = str_dup(buf);
  return;
} */
void do_freehold (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_FAE))
   {
      stc ("Huh?\n\r", ch);
      return;
   }
   if (ch->fight_timer > 0)
   {
      send_to_char ("Not until your fight timer expires.\n\r", ch);
      return;
   }

   if (IS_SET (ch->war, WARRING))
   {
      stc ("Not while in a war!\n\r", ch);
      return;
   }
   if (IS_SET (ch->flag2, AFF2_INARENA))
   {
      stc ("Not while in the arena!\n\r", ch);
      return;
   }

   if (!IS_AFFECTED (ch, AFF_SHADOWPLANE))
   {
      send_to_char ("You jump through the ground into the Umbra.\n\r", ch);
      act ("$n jumps into the ground and disappears.", ch, NULL, NULL,
	   TO_ROOM);
      SET_BIT (ch->affected_by, AFF_SHADOWPLANE);
      do_look (ch, "auto");
      return;
   }
   if (IS_AFFECTED (ch, AFF_SHADOWPLANE))
   {
      REMOVE_BIT (ch->affected_by, AFF_SHADOWPLANE);
      send_to_char ("You jump back into the real world.\n\r", ch);
      act ("$n leaps out of the ground.", ch, NULL, NULL, TO_ROOM);
      do_look (ch, "auto");
      return;
   }
}

void do_viewaura (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   OBJ_DATA *obj;
   char arg[MAX_INPUT_LENGTH];
   char buf[MAX_INPUT_LENGTH];

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

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

   if (ch->pcdata->powers[FAE_SOOT] < 1)
   {
      send_to_char ("You need level 1 Soothsay first.\n\r", ch);
      return;
   }

   if (arg[0] == '\0')
   {
      send_to_char ("View the aura on what?\n\r", ch);
      return;
   }

   if ((victim = get_char_room (ch, arg)) == NULL)
   {
      if ((obj = get_obj_carry (ch, arg)) == NULL)
      {
	 send_to_char ("View the aura on what?\n\r", ch);
	 return;
      }
      if (!IS_ITEMAFF (ch, ITEMA_VISION))
	 act ("$n examines $p intently.", ch, obj, NULL, TO_ROOM);
      spell_identify (skill_lookup ("identify"), ch->level, ch, obj);
      return;
   }

   if (!IS_ITEMAFF (ch, ITEMA_VISION))
      if (!IS_NPC (victim) && (IS_IMMUNE (victim, IMM_SHIELDED) ||
			       (IS_CLASS (victim, CLASS_DROW) &&
				IS_SET (victim->pcdata->powers[1],
					DPOWER_DROWSHIELD)))
	  && !IS_ITEMAFF (ch, ITEMA_VISION))
      {
	 send_to_char ("You are unable to read their aura.\n\r", ch);
	 return;
      }

   act ("$n examines $N intently.", ch, NULL, victim, TO_NOTVICT);
   act ("$n examines you intently.", ch, NULL, victim, TO_VICT);
   if (IS_NPC (victim))
      sprintf (buf, "%s is an NPC.\n\r", victim->short_descr);
   else
   {
      if (victim->level == 12)
	 sprintf (buf, "%s is an Implementor.\n\r", victim->name);
      else if (victim->level == 11)
	 sprintf (buf, "%s is a High Judge.\n\r", victim->name);
      else if (victim->level == 10)
	 sprintf (buf, "%s is a Judge.\n\r", victim->name);
      else if (victim->level == 9)
	 sprintf (buf, "%s is an Enforcer.\n\r", victim->name);
      else if (victim->level == 8)
	 sprintf (buf, "%s is a Quest Maker.\n\r", victim->name);
      else if (victim->level == 7)
	 sprintf (buf, "%s is a Builder.\n\r", victim->name);
      else if (victim->level >= 3)
	 sprintf (buf, "%s is an Avatar.\n\r", victim->name);
      else
	 sprintf (buf, "%s is a Mortal.\n\r", victim->name);
   }
   send_to_char (buf, ch);
   if (!IS_NPC (victim))
   {
      sprintf (buf, "Str:%d, Int:%d, Wis:%d, Dex:%d, Con:%d.\n\r",
	       get_curr_str (victim), get_curr_int (victim),
	       get_curr_wis (victim), get_curr_dex (victim),
	       get_curr_con (victim));
      send_to_char (buf, ch);
   }
   sprintf (buf, "Hp:%d/%d, Mana:%d/%d, Move:%d/%d.\n\r", victim->hit,
	    victim->max_hit, victim->mana, victim->max_mana, victim->move,
	    victim->max_move);
   send_to_char (buf, ch);
   if (!IS_NPC (victim))
      sprintf (buf, "Hitroll:%d, Damroll:%d, AC:%d.\n\r",
	       char_hitroll (victim), char_damroll (victim),
	       char_ac (victim));
   else
      sprintf (buf, "AC:%d.\n\r", char_ac (victim));
   send_to_char (buf, ch);
   if (!IS_NPC (victim))
   {
      sprintf (buf, "Status:%d, ", victim->race);
      send_to_char (buf, ch);
      if (IS_CLASS (victim, CLASS_VAMPIRE))
      {
	 sprintf (buf, "Blood:%d, ", victim->pcdata->condition[COND_THIRST]);
	 send_to_char (buf, ch);
      }
   }
   sprintf (buf, "Alignment:%d.\n\r", victim->alignment);
   send_to_char (buf, ch);
   if (!IS_NPC (victim) && IS_EXTRA (victim, EXTRA_PREGNANT))
      act ("$N is pregnant.", ch, NULL, victim, TO_CHAR);
   if (!IS_NPC (victim) && IS_CLASS (victim, CLASS_VAMPIRE))
   {
      send_to_char ("Disciplines:", ch);
      if (IS_VAMPAFF (victim, VAM_PROTEAN))
	 send_to_char (" Protean", ch);
      if (IS_VAMPAFF (victim, VAM_VICISSITUDE))
	 send_to_char (" vicissitude", ch);
      if (IS_VAMPAFF (victim, VAM_CELERITY))
	 send_to_char (" Celerity", ch);
      if (IS_VAMPAFF (victim, VAM_FORTITUDE))
	 send_to_char (" Fortitude", ch);
      if (IS_VAMPAFF (victim, VAM_POTENCE))
	 send_to_char (" Potence", ch);
      if (IS_VAMPAFF (victim, VAM_OBFUSCATE))
	 send_to_char (" Obfuscate", ch);
      if (IS_VAMPAFF (victim, VAM_OBTENEBRATION))
	 send_to_char (" Obtenebration", ch);
      if (IS_VAMPAFF (victim, VAM_SERPENTIS))
	 send_to_char (" Serpentis", ch);
      if (IS_VAMPAFF (victim, VAM_AUSPEX))
	 send_to_char (" Auspex", ch);
      if (IS_VAMPAFF (victim, VAM_DOMINATE))
	 send_to_char (" Dominate", ch);
      if (IS_VAMPAFF (victim, VAM_PRESENCE))
	 send_to_char (" Presence", ch);
      send_to_char (".\n\r", ch);
   }
   return;
}
void do_oakenshield (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_FAE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }

   if (ch->pcdata->powers[FAE_PRIM] < 3)
   {
      send_to_char ("You need level 3 Primal first.\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;
   }
   if (IS_IMMUNE (ch, IMM_SHIELDED))
   {
      send_to_char ("You stop shielding your aura.\n\r", ch);
      REMOVE_BIT (ch->immune, IMM_SHIELDED);
      return;
   }
}
void do_veiled (CHAR_DATA * ch, char *argument)
{
   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_FAE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (ch->pcdata->powers[FAE_CHIC] < 4)
   {
      send_to_char ("you need level 4 in Chicanery first.\n\r", ch);
      return;
   }

   if (IS_SET (ch->act, PLR_WIZINVIS))
   {
      REMOVE_BIT (ch->act, PLR_WIZINVIS);
      send_to_char ("You slowly fade into existance.\n\r", ch);
      act ("$n slowly fades into existance.", ch, NULL, NULL, TO_ROOM);
   }
   else
   {
      send_to_char ("You slowly fade out of existance.\n\r", ch);
      act ("$n slowly fades out of existance.", ch, NULL, NULL, TO_ROOM);
      SET_BIT (ch->act, PLR_WIZINVIS);
   }
   return;
}
void do_tattle (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   ROOM_INDEX_DATA *chroom;
   ROOM_INDEX_DATA *victimroom;
   char arg[MAX_INPUT_LENGTH];

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_FAE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (ch->pcdata->powers[FAE_SOOT] < 3)
   {
      send_to_char ("you need level 3 in Soothsay first.\n\r", ch);
      return;
   }

   if (arg[0] == '\0')
   {
      send_to_char ("use tattle tale on whom?\n\r", ch);
      return;
   }

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

   chroom = ch->in_room;
   victimroom = victim->in_room;

   char_from_room (ch);
   char_to_room (ch, victimroom);
   if (IS_AFFECTED (ch, AFF_SHADOWPLANE) && (!IS_AFFECTED (victim,
							   AFF_SHADOWPLANE)))
   {
      REMOVE_BIT (ch->affected_by, AFF_SHADOWPLANE);
      do_look (ch, "auto");
      SET_BIT (ch->affected_by, AFF_SHADOWPLANE);
   }
   else if (!IS_AFFECTED (ch, AFF_SHADOWPLANE) && (IS_AFFECTED (victim,
								AFF_SHADOWPLANE)))
   {
      SET_BIT (ch->affected_by, AFF_SHADOWPLANE);
      do_look (ch, "auto");
      REMOVE_BIT (ch->affected_by, AFF_SHADOWPLANE);
   }
   else
      do_look (ch, "auto");
   char_from_room (ch);
   char_to_room (ch, chroom);
   ch->fight_timer = 10;
   return;
}

/* GOOD elder form */
void do_elderform (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_FAE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (ch->pcdata->powers[FAE_PRIM] < 5)
   {
      send_to_char
	 ("You must obtain at least level 5 in Primal to don the Elder Form\n\r",
	  ch);
      return;
   }


   if (IS_SET (ch->extra2, EXTRA2_WYRM))
   {
      REMOVE_BIT (ch->extra2, EXTRA2_WYRM);
      act ("You leave the Elder Form.", ch, NULL, NULL, TO_CHAR);
      act ("$n leaves the Elder Form.", ch, NULL, NULL, TO_ROOM);
      REMOVE_BIT (ch->extra2, EXTRA2_FAEMIGHT);
      REMOVE_BIT (ch->extra2, EXTRA2_FAETOUGH);
      if (ch->hit < 1)
	 ch->hit = 1;
//    ch->damroll = ch->damroll - 400;
//    ch->hitroll = ch->hitroll - 200;
      clear_stats (ch);
      return;
   }

   act ("You take on the elder form.", ch, NULL, NULL, TO_CHAR);
   act ("$n's body bulges as $e takes on the Elder Form.", ch, NULL, NULL,
	TO_ROOM);
   SET_BIT (ch->extra2, EXTRA2_FAEMIGHT);
   SET_BIT (ch->extra2, EXTRA2_FAETOUGH);
//    ch->damroll = ch->damroll + 400;
//    ch->hitroll = ch->hitroll + 200;
   SET_BIT (ch->extra2, EXTRA2_WYRM);

   return;
}
void do_haunted (CHAR_DATA * ch, char *argument)
{

   CHAR_DATA *victim;

   if (IS_NPC (ch))
      return;

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

   if (ch->pcdata->powers[FAE_CHIC] < 3)
   {
      send_to_char ("you need level 3 in Chicanery to use Haunted Heart.\n\r",
		    ch);
      return;
   }

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

   act ("$n gazes into your eyes.", ch, NULL, victim, TO_VICT);
   act ("You gaze into $N's eyes.", ch, NULL, victim, TO_CHAR);
   act ("$n gazes into $N's eyes.", ch, NULL, victim, TO_NOTVICT);

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

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

   return;
}

/* Sluagh Squirm */
void do_squirm (CHAR_DATA * ch, char *argument)
{
   if (!IS_CLASS (ch, CLASS_FAE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if ((!IS_SET (ch->kith, KITH_SLUAGH)) && ((ch->pcdata->stats[UNI_GEN] > 2)))
   {
      send_to_char ("Only the Sluagh kiths and Gen 2 Fae can use this power.\n\r", ch);
      return;
   }

   if ((IS_CLASS (ch, CLASS_FAE)) && (!IS_SET (ch->kith, KITH_SLUAGH)) && ((ch->pcdata->stats[UNI_GEN] > 2)))
   {
      send_to_char ("Only the Sluagh kiths and Gen 2 Fae can use this power.\n\r", ch);
      return;
   }

   stc ("You try to squirm out of your restraints.\n\r", ch);
   act ("$n trys to squirm out of $s restraints.", ch, NULL, NULL, TO_ROOM);

   if (IS_EXTRA (ch, TIED_UP))
   {
      act ("You squirm out of the restraints.", ch, NULL, NULL, TO_CHAR);
      act ("$n squirms out if the restraints.", ch, NULL, NULL, TO_ROOM);
      REMOVE_BIT (ch->extra, TIED_UP);
   }
   if (is_affected (ch, gsn_web))
   {
      act ("$n squirms out of the webbing.", ch, NULL, NULL, TO_ROOM);
      send_to_char ("You squirm out of the webbing.\n\r", ch);
      affect_strip (ch, gsn_web);
   }
   if (IS_AFFECTED (ch, AFF_WEBBED))
   {
      act ("$n squirms out of the webbing.", ch, NULL, NULL, TO_ROOM);
      send_to_char ("You squirm out of the webbing.\n\r", ch);
      REMOVE_BIT (ch->affected_by, AFF_WEBBED);
   }
   if (IS_SET (ch->flag2, AFF2_TENDRILS))
   {
      act ("$n squirms out of the tendrils.", ch, NULL, NULL, TO_ROOM);
      send_to_char ("You squirm out of the tendrils.\n\r", ch);
      REMOVE_BIT (ch->flag2, AFF2_TENDRILS);
   }

   return;
}
void do_heather (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   char arg[MIL];

   argument = one_argument (argument, arg);

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

   if (ch->pcdata->powers[FAE_PRIM] < 2)
   {
      send_to_char ("you need level 2 in Primal to use Heather Balm.\n\r",
		    ch);
      return;
   }

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

   if ((victim = get_char_room (ch, arg)) == NULL)
   {
      stc ("You cannot find them here.\n\r", ch);
      return;
   }

   if (victim->hit >= victim->max_hit)
   {
      stc ("They are already at full health!\n\r", ch);
      return;
   }

   act ("You lay your hands on $N, fixing the damage within.", ch, NULL,
	victim, TO_CHAR);
   act ("$n lays $s hands on you, and you feel better.", ch, NULL, victim,
	TO_VICT);
   act ("$n lays $s hands on $N, and $N's body seems to charge with glamour.",
	ch, NULL, victim, TO_NOTVICT);
   victim->hit +=
      (number_range
       ((ch->pcdata->powers[FAE_PRIM] * 500),
	(ch->pcdata->powers[FAE_PRIM] * 700)));
   if (victim->hit > victim->max_hit)
      victim->hit = victim->max_hit;
   update_pos (victim);
   WAIT_STATE (ch, 24);
   return;
}


/* Changeling armor command for Boggans */
/* bugged */
void do_protocol (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *rch;

   if (IS_NPC (ch))
      return;

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

   if (ch->pcdata->powers[FAE_SOVE] < 1)
   {
      send_to_char ("You need level 1 in Sovereign to use Protocol.\n\r", ch);
      return;
   }

   if (ch->fight_timer > 0)
   {
      stc ("Not with a fight timer.\n\r", ch);
      return;
   }
   if (IS_EXTRA2 (ch, EXTRA2_NEUTRAL))
   {
      REMOVE_BIT (ch->extra2, EXTRA2_NEUTRAL);
      act ("$n stops making the time-out sign.", ch, NULL, NULL, TO_ROOM);
      send_to_char
	 ("The peaceful harmony in the air gradually fades away to nothing.\n\r",
	  ch);
      act ("The peaceful harmony in the air gradually fades away to nothing.",
	   ch, NULL, NULL, TO_ROOM);
      ch->pcdata->obeah = 30;
      return;
   }
   if (ch->in_room == NULL || ch->pcdata->obeah > 0)
   {
      send_to_char ("Nothing happens.\n\r", ch);
      return;
   }

   for (rch = ch->in_room->people; rch != NULL; rch = rch->next_in_room)
   {
       if (rch->fighting != NULL)
       {
        send_to_char("Not if people are fighting!\n\r",ch);
        return;
       }
   }
   if (IS_SET (ch->in_room->room_flags, ROOM_SAFE))
   {
      send_to_char ("The room is already under protocol.\n\r", ch);
      return;
   }

   SET_BIT (ch->extra2, EXTRA2_NEUTRAL);
   act ("$n makes the time-out sign.", ch, NULL, NULL, TO_ROOM);
   send_to_char ("You make the time-out sign.\n\r", ch);
   ch->pcdata->obeah = 60;
   send_to_char ("The air is filled with peaceful harmony.\n\r", ch);
   act ("The air is filled with peaceful harmony.", ch, NULL, NULL, TO_ROOM);
/*   for (rch = ch->in_room->people; rch != NULL; rch = rch->next_in_room)
   {
      if (rch->fighting != NULL)
	 stop_fighting (rch, TRUE);
   }*/
   return;
}

/* slightly bugged, fix soon */
void do_willow (CHAR_DATA * ch, char *argument)
{
   char arg1[MAX_INPUT_LENGTH];
   char arg2[MAX_INPUT_LENGTH];
   OBJ_DATA *obj;
   CHAR_DATA *victim;

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

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

   if (ch->pcdata->powers[FAE_PRIM] < 1)
   {
      send_to_char ("you need level 1 in Primal to use Willow Wisp.\n\r", ch);
      return;
   }


   if (arg2[0] == '\0')
   {
      send_to_char ("Transport who what?\n\r", ch);
      return;
   }
   if ((victim = get_char_world (ch, arg2)) == NULL)
   {
      send_to_char ("They aren't here.\n\r", ch);
      return;
   }
   if (victim == ch)
   {
      send_to_char ("You cannot send things to yourself!\n\r", ch);
      return;
   }
   if (victim->in_room == NULL || victim->in_room == ch->in_room)
   {
      send_to_char ("But they're right here!\n\r", ch);
      return;
   }
   if ((obj = get_obj_carry (ch, arg1)) == NULL)
   {
      send_to_char ("You do not have that item.\n\r", ch);
      return;
   }
   if (!IS_NPC (victim) && !IS_IMMUNE (victim, IMM_TRANSPORT))
   {
      {
	 send_to_char ("You are unable to transport anything to them.\n\r",
		       ch);
	 return;
      }
/*
		if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) {
			guardian_message(victim);
		act("$n just failed to send $p to you via a will-o-wisp.",ch,obj,victim,TO_VICT);
		}
		return;
*/
   }

   // NO OTHER CHECKS AFTER THIS POINT
//      if (check_giveto_mob(ch, victim, obj)) return;

   if (IS_SET(obj->quest, QUEST_ARTIFACT) )
   {
	stc("You failed!\n\r", ch);
        return;
   }
   send_to_char
      ("A will-o-wisp blinks into existance and lands on your shoulder.\n\r",
       ch);
   act ("A will-o-wisp blinks into existance and lands on $n's shoulder.", ch,
	NULL, NULL, TO_ROOM);
   act ("You give $p to the will-o-wisp.", ch, obj, NULL, TO_CHAR);
   act ("$n gives $p to the will-o-wisp.", ch, obj, NULL, TO_ROOM);
   send_to_char
      ("The will-o-wisp giggles and jumps through a rift in reality.\n\r",
       ch);
   act ("The will-o-wisp giggles and jumps through a rift in reality.", ch,
	NULL, NULL, TO_ROOM);

   obj_from_char (obj);
   obj_to_char (obj, victim);

   send_to_char
      ("A rift in reality appears and a will-o-wisp flies out landing on your shoulder.\n\r",
       victim);
   act ("A rift in reality appears and a will-o-wisp flies out landing on $n's shoulder.", victim, NULL, NULL, TO_ROOM);
   act ("You take $p from the will-o-wisp.", victim, obj, NULL, TO_CHAR);
   act ("$n takes $p from the will-o-wisp.", victim, obj, NULL, TO_ROOM);
   send_to_char
      ("The will-o-wisp kisses your cheek and blinks out of existance.\n\r",
       victim);
   act ("The will-o-wisp kisses $n's cheek and blinks out of existance.",
	victim, NULL, NULL, TO_ROOM);

   do_autosave (ch, "");
   do_autosave (victim, "");
/*
    if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) 
		guardian_message(victim);

		act("$n just sent $p to you via will-o-wisp.",ch,obj,victim,TO_VICT);
	}
*/
   return;
}
void do_faecharm (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   char arg[MAX_INPUT_LENGTH];
   int sn;
   int level;
   int spelltype;
   char buf[MAX_STRING_LENGTH];
   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_FAE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if ((!IS_SET (ch->kith, KITH_POOKA)) && ((ch->pcdata->stats[UNI_GEN] > 2)))
   {
      send_to_char ("Only the Pooka kiths and Gen 2 Fae can use this power.\n\r", ch);
      return;
   }

   if ((IS_CLASS (ch, CLASS_FAE)) && (!IS_SET (ch->kith, KITH_POOKA)) && ((ch->pcdata->stats[UNI_GEN] > 2)))
   {
      send_to_char ("Only the Pooka kiths and Gen 2 Fae can use this power.\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 ("You cannot charm yourself.\n\r", ch);
      return;
   }

   if (IS_AFFECTED (victim, AFF_ETHEREAL))
   {
      send_to_char ("You cannot charm an ethereal person.\n\r", ch);
      return;
   }
   if (is_safe (ch, victim) == TRUE)
      return;
   sprintf (buf, "A look of concentration crosses your face.");
   act (buf, ch, NULL, NULL, TO_CHAR);
   sprintf (buf, "A look of concentration crosses over $n's face.\n\r");
   act (buf, ch, NULL, victim, TO_ROOM);

   if ((sn = skill_lookup ("charm")) < 0)
      return;
   spelltype = skill_table[sn].target;
   level = 240;
   (*skill_table[sn].spell_fun) (sn, level, ch, victim);
   WAIT_STATE (ch, 12);
   return;
}
void do_geasa (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   CHAR_DATA *familiar;
   char arg[MAX_INPUT_LENGTH];
   char buf[MAX_STRING_LENGTH];

   one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

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

   if (ch->pcdata->powers[FAE_SOVE] < 5)
   {
      send_to_char ("you need level 5 in Sovereign to use Geasa.\n\r", ch);
      return;
   }

   if ((familiar = ch->pcdata->familiar) != NULL)
   {
      sprintf (buf, "You release %s.\n\r", familiar->short_descr);
      send_to_char (buf, ch);
      familiar->wizard = NULL;
      ch->pcdata->familiar = NULL;
      return;
   }

   if (arg[0] == '\0')
   {
      send_to_char ("What do you wish to command using Geasa?\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 ("What an intelligent idea!\n\r", ch);
      return;
   }

   if (!IS_NPC (victim))
   {
      send_to_char ("Not on players.\n\r", ch);
      return;
   }
   if (victim->level > 150)
   {
      stc ("They are too powerful to control\n\r", ch);
      return;
   }
   if (victim->wizard != NULL)
   {
      send_to_char ("You are unable to command them.\n\r", ch);
      return;
   }

   if (victim->level > 350)
   {
      send_to_char ("They are too powerful.\n\r", ch);
      return;
   }
   ch->pcdata->familiar = victim;
   victim->wizard = ch;
   act ("You take over $N's mind using the art of Geasa.", ch, NULL, victim,
	TO_CHAR);
   act ("$n is staring at you!", ch, NULL, victim, TO_VICT);
   act ("$n starts staring at $N", ch, NULL, victim, TO_NOTVICT);
   return;
}

/* these last three commands are fucked a bit, fix later */
void do_phantom (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   AFFECT_DATA af;
   char arg1[MIL];
   int sn;

   argument = one_argument (argument, arg1);

   if (IS_NPC (ch))
      return;

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

   if (ch->pcdata->powers[FAE_LEGE] < 5)
   {
      send_to_char
	 ("you need level 5 in Legerdemain to use Phantom Shadows.\n\r", ch);
      return;
   }

   if (arg1[0] == '\0')
   {
      send_to_char ("You can create a wyrm or a phoenix.\n\r", ch);
      return;
   }

   if (ch->pcdata->followers > 3)
   {
      stc ("Nothing happens..\n\r", ch);
      return;
   }
   if (!str_cmp (arg1, "wyrm"))
   {
      ch->pcdata->followers++;

      victim = create_mobile (get_mob_index (MOB_VNUM_GUARDIAN));
      victim->short_descr = str_dup ("A massive elder wyrm");
      victim->name = str_dup ("wyrm");
      victim->long_descr =
	 str_dup
	 ("A massive elder wyrm is here coiling up in readiness.\n\r ");
      victim->level = 349;
      victim->hit = 15000;
      victim->max_hit = 15000;
      victim->hitroll = 250;
      victim->damroll = 250;
      victim->armor = -1000;
      SET_BIT (victim->act, ACT_NOEXP);
      act ("You twirl around in a circle.\nThe ground itself begins to crack open.\nSuddenly,  A massive elder wyrm breaks through and swerves in front of you.", ch, NULL, NULL, TO_CHAR);
      act ("$n twirls about in a circle.\nThe ground itself begins to crack open.\nSuddenly, A massive elder wyrm breaks through and swerves in front on $n!", ch, NULL, NULL, TO_ROOM);
      char_to_room (victim, ch->in_room);

if ((sn = skill_lookup ("guardian")) < 0)
   {
      send_to_char ("Bug - please inform a coder.\n\r", ch);
      return;
   }
      
   af.type = sn;
   af.duration = 666;
   af.location = APPLY_NONE;
   af.modifier = 0;
   af.bitvector = AFF_CHARM;
   affect_to_char (victim, &af);
      return;
   }

   if (!str_cmp (arg1, "phoenix"))
   {
      ch->pcdata->followers++;

      victim = create_mobile (get_mob_index (MOB_VNUM_GUARDIAN));
      victim->short_descr = str_dup ("A magnificent phoenix");
      victim->name = str_dup ("phoenix");
      victim->long_descr =
	 str_dup ("A magnificent phoenix hovers in the air waiting. \n\r");
      victim->level = 349;
      victim->hit = 20000;
      victim->max_hit = 20000;
      victim->hitroll = 250;
      victim->damroll = 250;
      victim->armor = -2000;
      SET_BIT (victim->act, ACT_NOEXP);

      act ("You twist and contort your body in a frenzied dance.\nThe sky itself begins to split open.\nSuddenly,  A magnificent phoenix breaks through and lands before you.", ch, NULL, NULL, TO_CHAR);
      act ("$n twists and contorts $s body in a frenzied dance.\nThe sky itself begins to split open.\nSuddenly, A magnificent phoenix breaks through and lands in front on $n!", ch, NULL, NULL, TO_ROOM);
      char_to_room (victim, ch->in_room);

      add_follower (victim, ch);
if ((sn = skill_lookup ("guardian")) < 0)
   {
      send_to_char ("Bug - please inform a coder.\n\r", ch);
      return;
   }
      
      af.type = sn;
      af.duration = 666;
      af.location = APPLY_NONE;
      af.modifier = 0;
      af.bitvector = AFF_CHARM;
      affect_to_char (victim, &af);
      return;
   }
}
void do_dreaming (CHAR_DATA * ch, char *argument)
{
   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_FAE))
   {
      do_huh (ch, "");
      return;
   }
   if (IS_EXTRA2 (ch, EXTRA2_DREAMING))
   {
      stc ("You leave the Dreaming.\n\r", ch);
      REMOVE_BIT (ch->extra2, EXTRA2_DREAMING);
      act ("$n has left the Dreaming.\n\r", ch, NULL, NULL, TO_ROOM);
      return;
   }

   if (ch->position > POS_SLEEPING)
   {
      stc ("You must be asleep to enter the Dreaming.\n\r", ch);
      return;
   }

   if (ch->fight_timer > 0)
   {
      stc ("Your mind is in too much of a frenzy to enter the Dreaming.\n\r",
	   ch);
      return;
   }


   stc ("You enter the Dreaming.\n\r", ch);
   act ("$n enters the Dreaming.", ch, NULL, NULL, TO_ROOM);

   SET_BIT (ch->extra2, EXTRA2_DREAMING);
}

/*
void do_court( CHAR_DATA *ch, char *argument )
{
    CHAR_DATA *victim;
    char      arg1 [MAX_INPUT_LENGTH];
    char      arg2 [MAX_INPUT_LENGTH];
    argument = one_argument( argument, arg1 );
    argument = one_argument( argument, arg2 );
    if ( IS_NPC(ch) ) return;
    if (!IS_CLASS(ch, CLASS_FAE) && IS_SET(ch->special, SPC_FAE_PRINCE) ||
ch->pcdata->stats[UNI_GEN] != 2) )     { 	stc("Huh?\n\r",ch);
	return;
    }

    if ( arg1[0] == '\0' || arg2[0] == '\0' )
    {
	send_to_char( "Syntax is: court <target> <prince/enchant>\n\r", ch );
	return;
    }

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

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

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

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

    if ( str_cmp(victim->clan,ch->clan) && str_cmp(arg2,"induct") )
    {
	send_to_char( "You can only grant your favour to someone in your court.\n\r", ch );
	return;
    }

    if ( ch->pcdata->stats[UNI_GEN] >= victim->pcdata->stats[UNI_GEN] )
    {
	send_to_char( "You can only grant your favour to someone of a lower rank.\n\r", ch );
	return;
    }

    if ( !str_cmp(arg2,"prince") && ch->pcdata->stats[UNI_GEN] == 2)
    {
	if (IS_SET(victim->special,SPC_FAE_PRINCE)) {
	act("You remove $N's prince privilages!",ch,NULL,victim,TO_CHAR);
	act("$n removes $N's prince privilages!",ch,NULL,victim,TO_NOTVICT);
	act("$n removes your prince privilages!",ch,NULL,victim,TO_VICT);
	if (IS_SET(victim->special,SPC_FAE_SIRE)) REMOVE_BIT(victim->special,SPC_FAE_SIRE);
	REMOVE_BIT(victim->special,SPC_FAE_PRINCE);return;}
	act("You make $N a prince!",ch,NULL,victim,TO_CHAR);
	act("$n has made $N a prince!",ch,NULL,victim,TO_NOTVICT);
	act("$n has made you a prince!",ch,NULL,victim,TO_VICT);
	SET_BIT(victim->special,SPC_FAE_PRINCE);
	if (IS_SET(victim->special,SPC_FAE_SIRE)) REMOVE_BIT(victim->special,SPC_FAE_SIRE);
	return;
    }
    else if ( !str_cmp(arg2,"enchant") && (ch->pcdata->stats[UNI_GEN] == 2 || IS_SET(ch->special,SPC_FAE_PRINCE)))
    {
	if (IS_SET(victim->special,SPC_FAE_SIRE)) {
	act("You remove $N's permission to enchant a mortal!",ch,NULL,victim,TO_CHAR);
	act("$n has removed $N's permission to enchant a mortal!",ch,NULL,victim,TO_NOTVICT);
	act("$n has remove your permission to enchant a mortal!",ch,NULL,victim,TO_VICT);
	REMOVE_BIT(victim->special,SPC_FAE_SIRE);return;}
	act("You grant $N permission to enchant a mortal!",ch,NULL,victim,TO_CHAR);
	act("$n has granted $N permission enchant a mortal!",ch,NULL,victim,TO_NOTVICT);
	act("$n has granted you permission enchant a mortal!",ch,NULL,victim,TO_VICT);
	SET_BIT(victim->special,SPC_FAE_SIRE);
	return;
    }
    else if ( !str_cmp(arg2,"outcast") && victim->pcdata->stats[UNI_GEN] > 2 && 
	ch->pcdata->stats[UNI_GEN] == 2)
    {
	act("You make $N an Outcast!",ch,NULL,victim,TO_CHAR);
	act("$n has made $N an Outcast!",ch,NULL,victim,TO_NOTVICT);
	act("$n has made you an Outcast!",ch,NULL,victim,TO_VICT);
	free_string(victim->clan);
	victim->clan = str_dup( "" );
	return;
    }
    else if ( !str_cmp(arg2,"outcast") && victim->pcdata->stats[UNI_GEN] > 2 && 
	!IS_SET(victim->special, SPC_FAE_PRINCE) && IS_SET(ch->special,SPC_FAE_PRINCE))
    {
	act("You make $N an Outcast!",ch,NULL,victim,TO_CHAR);
	act("$n has made $N an Outcast!",ch,NULL,victim,TO_NOTVICT);
	act("$n has made you an Outcast!",ch,NULL,victim,TO_VICT);
	free_string(victim->clan);
	victim->clan = str_dup( "" );
	return;
    }
    else if ( !str_cmp(arg2,"induct") && victim->pcdata->stats[UNI_GEN] > 2 && 
	ch->pcdata->stats[UNI_GEN] == 2 && strlen(victim->clan) < 2)
    {
	if (IS_SET(victim->special, SPC_REBEL))
	{
	    send_to_char("You cannot induct a Rebel!\n\r",ch);
	    return;
	}
	act("You induct $N into your court!",ch,NULL,victim,TO_CHAR);
	act("$n inducts $N into $s court!",ch,NULL,victim,TO_NOTVICT);
	act("$n inducts you into $s court!",ch,NULL,victim,TO_VICT);
	free_string(victim->clan);
	victim->clan = str_dup( ch->clan );
	return;
    }
    else if ( !str_cmp(arg2,"induct") && victim->pcdata->stats[UNI_GEN] > 2 && 
	!IS_SET(victim->special, SPC_FAE_PRINCE) && IS_SET(ch->special,SPC_FAE_PRINCE) &&
	strlen(victim->clan) < 2)
    {
	if (IS_SET(victim->special, SPC_REBEL))
	{
	    send_to_char("You cannot induct a Rebel!\n\r",ch);
	    return;
	}
	act("You induct $N into your court!",ch,NULL,victim,TO_CHAR);
	act("$n inducts $N into $s court!",ch,NULL,victim,TO_NOTVICT);
	act("$n inducts you into $s court!",ch,NULL,victim,TO_VICT);
	free_string(victim->clan);
	victim->clan = str_dup( ch->clan );
	return;
    }
    else if ( !str_cmp(arg2,"accept") &&
	(ch->pcdata->stats[UNI_GEN] == 2 || IS_SET(ch->special,SPC_FAE_PRINCE)))
    {
	if ( victim->pcdata->rank > AGE_CHILDLING)
	{ send_to_char("But they are not a Childling!\n\r",ch); return; }
	act("You accept $N into the court!",ch,NULL,victim,TO_CHAR);
	act("$n has accepted $N into $s court!",ch,NULL,victim,TO_NOTVICT);
	act("$n accepted you into $s court!",ch,NULL,victim,TO_VICT);
	victim->pcdata->rank = AGE_WILDER;
	return;
    }
    else send_to_char( "You are unable to grant that sort of favour.\n\r", ch );
    return;
}
*/
void do_quicksilver (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_FAE))
   {
      stc ("Huh?\n\r", ch);
      return;
   }
   if (ch->pcdata->powers[FAE_WAYF] < 1)
   {
      send_to_char ("You need level 1 Wayfare first.\n\r", ch);
      return;
   }


   if (!IS_SET (ch->extra2, EXTRA2_FAESPEED))
   {
      send_to_char ("You start moving faster than the eye can follow.\n\r",
		    ch);
      act ("$n starts moving faster than the eye can follow.", ch, NULL, NULL,
	   TO_ROOM);
      SET_BIT (ch->extra2, EXTRA2_FAESPEED);
      return;
   }
   else
   {
      REMOVE_BIT (ch->extra2, EXTRA2_FAESPEED);
      send_to_char ("You slow down.\n\r", ch);
      act ("$n slows down.", ch, NULL, NULL, TO_ROOM);
      return;
   }
}
void do_poisonweapon (CHAR_DATA * ch, char *argument)
{
   OBJ_DATA *obj;


   if (!IS_CLASS (ch, CLASS_FAE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if ((!IS_SET (ch->kith, KITH_NOCKER)) && ((ch->pcdata->stats[UNI_GEN] > 2)))
   {
      send_to_char ("Only the Nocker kiths and Gen 2 Fae can use this power.\n\r", ch);
      return;
   }

   if ((IS_CLASS (ch, CLASS_FAE)) && (!IS_SET (ch->kith, KITH_NOCKER)) && ((ch->pcdata->stats[UNI_GEN] > 2)))
   {
      send_to_char ("Only the Nocker kiths and Gen 2 Fae can use this power.\n\r", ch);
      return;
   }

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

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

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


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

   act ("You dip your hands in some liquid and rub it along $p, coating it with a sickly venom.", ch, obj, NULL, TO_CHAR);
   act ("$n dips $m hands in some liquid and rubs it along $p, coating it with a sickly venom.", ch, obj, NULL, TO_ROOM);

   WAIT_STATE (ch, 8);
   SET_BIT (obj->weapflags, WEAPON_POISON);
   obj->value[1] += ch->pcdata->stats[UNI_GEN];
   obj->value[2] += ch->pcdata->stats[UNI_GEN];
}
void do_freezeweapon (CHAR_DATA * ch, char *argument)
{
   OBJ_DATA *obj;


   if (!IS_CLASS (ch, CLASS_FAE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if ((!IS_SET (ch->kith, KITH_NOCKER)) && ((ch->pcdata->stats[UNI_GEN] > 2)))
   {
      send_to_char ("Only the Nocker kiths and Gen 2 Fae can use this power.\n\r", ch);
      return;
   }

   if ((IS_CLASS (ch, CLASS_FAE)) && (!IS_SET (ch->kith, KITH_NOCKER)) && ((ch->pcdata->stats[UNI_GEN] > 2)))
   {
      send_to_char ("Only the Nocker kiths and Gen 2 Fae can use this power.\n\r", ch);
      return;
   }


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

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

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


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

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

   WAIT_STATE (ch, 8);
   SET_BIT (obj->weapflags, WEAPON_FROST);
}
void do_flameweapon (CHAR_DATA * ch, char *argument)
{
   OBJ_DATA *obj;


   if (!IS_CLASS (ch, CLASS_FAE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if ((!IS_SET (ch->kith, KITH_NOCKER)) && ((ch->pcdata->stats[UNI_GEN] > 2)))
   {
      send_to_char ("Only the Nocker kiths and Gen 2 Fae can use this power.\n\r", ch);
      return;
   }

   if ((IS_CLASS (ch, CLASS_FAE)) && (!IS_SET (ch->kith, KITH_NOCKER)) && ((ch->pcdata->stats[UNI_GEN] > 2)))
   {
      send_to_char ("Only the Nocker kiths and Gen 2 Fae can use this power.\n\r", ch);
      return;
   }

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

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

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


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

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

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

/* Eshu's cover(hide) and sap */
void do_cover (CHAR_DATA * ch, char *argument)
{
   if (IS_NPC (ch))
      return;

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

   if ((!IS_SET (ch->kith, KITH_ESHU)) && ((ch->pcdata->stats[UNI_GEN] > 2)))
   {
      send_to_char ("Only the Eshu kiths and Gen 2 Fae can use this power.\n\r", ch);
      return;
   }

   if ((IS_CLASS (ch, CLASS_FAE)) && (!IS_SET (ch->kith, KITH_ESHU)) && ((ch->pcdata->stats[UNI_GEN] > 2)))
   {
      send_to_char ("Only the Eshu kiths and Gen 2 Fae can use this power.\n\r", ch);
      return;
   }

   if (IS_AFFECTED (ch, AFF_HIDE))
   {
      REMOVE_BIT (ch->affected_by, AFF_HIDE);
      act ("$n appears from the shadows.", ch, NULL, NULL, TO_ROOM);
      send_to_char ("You appear from the shadows.\n\r", ch);
   }
   else
   {
      act ("$n disappears into the shadows.", ch, NULL, NULL, TO_ROOM);
      send_to_char ("You disappear into the shadows.\n\r", ch);
      SET_BIT (ch->affected_by, AFF_HIDE);
   }
   return;
}
void do_sap (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   char arg1[MAX_INPUT_LENGTH];
   argument = one_argument (argument, arg1);

   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_FAE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if ((!IS_SET (ch->kith, KITH_ESHU)) && ((ch->pcdata->stats[UNI_GEN] > 2)))
   {
      send_to_char ("Only the Eshu kiths and Gen 2 Fae can use this power.\n\r", ch);
      return;
   }

   if ((IS_CLASS (ch, CLASS_FAE)) && (!IS_SET (ch->kith, KITH_ESHU)) && ((ch->pcdata->stats[UNI_GEN] > 2)))
   {
      send_to_char ("Only the Eshu kiths and Gen 2 Fae can use this power.\n\r", ch);
      return;
   }

   if (arg1[0] == '\0')
   {
      send_to_char ("Sap who?\n\r", ch);
      return;
   }

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

   if (!IS_AFFECTED (ch, AFF_HIDE))
   {
      send_to_char
	 ("You cannot knockout someone if you are not in cover.\n\r", ch);
      return;
   }

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

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

   if (victim->in_room == ch->in_room)
   {
      act ("You jump from the shadows and smack $N against the back\n\r their head, sending them down.", ch, NULL, victim, TO_CHAR);
      act ("$n jumps from the shadows and smacks you upside the head\n\r with a heavy sap\n\rYou feel dizzy and stunned.", ch, NULL, victim, TO_VICT);
      REMOVE_BIT (ch->affected_by, AFF_HIDE);
      victim->position = POS_STUNNED;
      WAIT_STATE (ch, 24);
      return;
   }

   return;
}

/* sluagh's shadowshade */
void do_shadowshade (CHAR_DATA * ch, char *argument)
{
   char buf[MAX_STRING_LENGTH];

   if (IS_NPC (ch))
      return;
   if (!IS_CLASS (ch, CLASS_FAE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if ((!IS_SET (ch->kith, KITH_SLUAGH)) && ((ch->pcdata->stats[UNI_GEN] > 2)))
   {
      send_to_char ("Only the Sluagh kiths and Gen 2 Fae can use this power.\n\r", ch);
      return;
   }

   if ((IS_CLASS (ch, CLASS_FAE)) && (!IS_SET (ch->kith, KITH_SLUAGH)) && ((ch->pcdata->stats[UNI_GEN] > 2)))
   {
      send_to_char ("Only the Sluagh kiths and Gen 2 Fae can use this power.\n\r", ch);
      return;
   }

   if (IS_SET (ch->newbits, NEW_DARKNESS))
   {
      send_to_char ("You banish the darkness surrounding you.\n\r", ch);
      act ("The darkness surrounding $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;
   }

   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);

   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);

   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_showcourt (CHAR_DATA * ch, char *argument)
{
   char buf[MAX_STRING_LENGTH];
   char arg[MAX_INPUT_LENGTH];
   char lord[MAX_INPUT_LENGTH];
   CHAR_DATA *gch;

   one_argument (argument, arg);

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

   if (ch->pcdata->stats[UNI_GEN] < 3)
      strcpy (lord, ch->name);
   else
      strcpy (lord, ch->lord);
   sprintf (buf, "The changelings of %s:\n\r", lord);
   send_to_char (buf, ch);
   send_to_char
      ("[      Name      ] [ Hits ] [ Mana ] [ Move ] [   Exp    ]\n\r", ch);
   for (gch = char_list; gch != NULL; gch = gch->next)
   {
      if (IS_NPC (gch))
	 continue;
      if (!IS_CLASS (gch, CLASS_FAE))
	 continue;
      if (!str_cmp (ch->lord, lord) || !str_cmp (ch->name, lord))
      {
	 sprintf (buf,
                  "[%-16s] [%-6d] [%-6d] [%-6d] [%-10lli]\n\r",
		  capitalize (gch->name),
		  gch->hit, gch->mana, gch->move, gch->exp);
	 send_to_char (buf, ch);
      }
   }
   return;
}
void do_faesteed (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   AFFECT_DATA af;

   if (IS_NPC (ch))
      return;
   if (!IS_CLASS (ch, CLASS_FAE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if ((!IS_SET (ch->kith, KITH_SIDHE)) && ((ch->pcdata->stats[UNI_GEN] > 2)))
   {
      send_to_char ("Only the Sidhe kiths and Gen 2 Fae can use this power.\n\r", ch);
      return;
   }

   if ((IS_CLASS (ch, CLASS_FAE)) && (!IS_SET (ch->kith, KITH_SIDHE)) && ((ch->pcdata->stats[UNI_GEN] > 2)))
   {
      send_to_char ("Only the Sidhe kiths and Gen 2 Fae can use this power.\n\r", ch);
      return;
   }

   if (ch->pcdata->followers > 3)
   {
      stc ("Nothing happens..\n\r", ch);
      return;
   }

   ch->pcdata->followers++;

   victim = create_mobile (get_mob_index (MOB_VNUM_MOUNT));
   free_string (victim->short_descr);
   victim->short_descr = str_dup ("A massive chimerical horse");
   free_string (victim->name);
   victim->name = str_dup ("horse");
   free_string (victim->long_descr);
   victim->long_descr =
      str_dup
      ("A massive chimerical horse glowing with glamour stands here.\n\r");
   victim->level = 500;
   victim->hit = 15000;
   victim->max_hit = 15000;
   victim->hitroll = 250;
   victim->damroll = 250;
   victim->armor = -1500;
   SET_BIT (victim->act, ACT_NOEXP);
   SET_BIT (victim->act, ACT_MOUNT);

   act ("You whistle loudly.\nYou hear a loud trotting off in the distance.\n  Suddenly a massive glowing horse jumps in from nowhere and stands before you.", ch, NULL, NULL, TO_CHAR);
   act ("$n whistles loudly.\nYou hear a loud trotting off in the distance.\n  Suddenly a massive glowing horse jumps in from nowhere and stands before $n!", ch, NULL, NULL, TO_ROOM);
   char_to_room (victim, ch->in_room);

   add_follower (victim, ch);
   af.duration = 666;
   af.location = APPLY_NONE;
   af.modifier = 0;
   af.bitvector = AFF_CHARM;
   affect_to_char (victim, &af);
   return;
}
void do_teethclench (CHAR_DATA * ch, char *argument)
{
   if (!IS_CLASS (ch, CLASS_FAE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if ((!IS_SET (ch->kith, KITH_REDCAP)) && ((ch->pcdata->stats[UNI_GEN] > 2)))
   {
      send_to_char ("Only the Redcap kiths and Gen 2 Fae can use this power.\n\r", ch);
      return;
   }

   if ((IS_CLASS (ch, CLASS_FAE)) && (!IS_SET (ch->kith, KITH_REDCAP)) && ((ch->pcdata->stats[UNI_GEN] > 2)))
   {
      send_to_char ("Only the Redcap kiths and Gen 2 Fae can use this power.\n\r", ch);
      return;
   }


   if (IS_SET (ch->garou1, GAROU_CLENCHED))
   {
      stc ("You relax your jaw.\n\r", ch);
      REMOVE_BIT (ch->garou1, GAROU_CLENCHED);
      return;
   }

   if (!IS_GAR1 (ch, GAROU_CLENCHED))
   {
      stc ("You prepare to clench your jaw on your opponents.\n\r", ch);
      SET_BIT (ch->garou1, GAROU_CLENCHED);
      return;
   }
   return;
}

void do_silentwalk (CHAR_DATA * ch, char *argument)
{
   if (!IS_CLASS (ch, CLASS_FAE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if ((!IS_SET (ch->kith, KITH_ESHU)) && ((ch->pcdata->stats[UNI_GEN] > 2)))
   {
      send_to_char ("Only the Eshu kiths and Gen 2 Fae can use this power.\n\r", ch);
      return;
   }

   if ((IS_CLASS (ch, CLASS_FAE)) && (!IS_SET (ch->kith, KITH_ESHU)) && ((ch->pcdata->stats[UNI_GEN] > 2)))
   {
      send_to_char ("Only the Eshu kiths and Gen 2 Fae can use this power.\n\r", ch);
      return;
   }

   send_to_char ("Your footsteps stop making any sound.\n\r", ch);

   if (!IS_AFFECTED (ch, AFF_SNEAK))
   {
      SET_BIT (ch->affected_by, AFF_SNEAK);
      return;
   }
   return;
}
void do_entrap (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_FAE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if ((!IS_SET (ch->kith, KITH_SLUAGH)) && ((ch->pcdata->stats[UNI_GEN] > 2)))
   {
      send_to_char ("Only the Sluagh kiths and Gen 2 Fae can use this power.\n\r", ch);
      return;
   }

   if ((IS_CLASS (ch, CLASS_FAE)) && (!IS_SET (ch->kith, KITH_SLUAGH)) && ((ch->pcdata->stats[UNI_GEN] > 2)))
   {
      send_to_char ("Only the Sluagh kiths and Gen 2 Fae can use this power.\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 ("You cannot entrap yourself.\n\r", ch);
      return;
   }

   if (IS_AFFECTED (victim, AFF_ETHEREAL))
   {
      send_to_char ("You cannot entrap an ethereal person.\n\r", ch);
      return;
   }

   if ((sn = skill_lookup ("web")) < 0)
      return;
   spelltype = skill_table[sn].target;
   level = ch->spl[spelltype] * 0.25;
   (*skill_table[sn].spell_fun) (sn, level, ch, victim);
   WAIT_STATE (ch, 12);
   return;
}
void do_redclaws (CHAR_DATA * ch, char *argument)
{

   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_FAE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if ((!IS_SET (ch->kith, KITH_REDCAP)) && ((ch->pcdata->stats[UNI_GEN] > 2)))
   {
      send_to_char ("Only the Redcap kiths and Gen 2 Fae can use this power.\n\r", ch);
      return;
   }

   if ((IS_CLASS (ch, CLASS_FAE)) && (!IS_SET (ch->kith, KITH_REDCAP)) && ((ch->pcdata->stats[UNI_GEN] > 2)))
   {
      send_to_char ("Only the Redcap kiths and Gen 2 Fae can use this power.\n\r", ch);
      return;
   }


   if (IS_VAMPAFF (ch, VAM_CLAWS))
   {

      send_to_char
	 ("You remove the blood stained claws from your wrists.\n\r", ch);
      REMOVE_BIT (ch->pcdata->stats[UNI_AFF], VAM_CLAWS);
      return;
   }

   send_to_char ("You attach blood stained claws to your wrists.\n\r", ch);
   SET_BIT (ch->pcdata->stats[UNI_AFF], VAM_CLAWS);

   return;
}

/* Changeling weapon command for Nockers */
void do_craftweapon (CHAR_DATA * ch, char *argument)
{
/*    OBJ_INDEX_DATA *pObjIndex; */
   OBJ_DATA *obj;
   char arg[MAX_INPUT_LENGTH];
   char arg2[MAX_INPUT_LENGTH];
   int vnum = 0;

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

   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_FAE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if ((!IS_SET (ch->kith, KITH_NOCKER)) && ((ch->pcdata->stats[UNI_GEN] > 2)))
   {
      send_to_char ("Only the Nocker kiths and Gen 2 Fae can use this power.\n\r", ch);
      return;
   }

   if ((IS_CLASS (ch, CLASS_FAE)) && (!IS_SET (ch->kith, KITH_NOCKER)) && ((ch->pcdata->stats[UNI_GEN] > 2)))
   {
      send_to_char ("Only the Nocker kiths and Gen 2 Fae can use this power.\n\r", ch);
      return;
   }

   if (arg[0] == '\0')
   {
      send_to_char ("Command: craftweapon <color> <type>.\n\r", ch);
      return;
   }

   if (arg2[0] == '\0')
   {
      send_to_char
	 ("Please specify which type of chimerical weapon you wish to make:\n\rLongsword Axe Flail Dagger Spear Claw Mace.\n\r",
	  ch);
      return;
   }

   if (!str_cmp (arg2, "longsword") && !str_cmp (arg, "copper"))
      vnum = 229;
   else if (!str_cmp (arg2, "axe") && !str_cmp (arg, "copper"))
      vnum = 230;
   else if (!str_cmp (arg2, "flail") && !str_cmp (arg, "copper"))
      vnum = 231;
   else if (!str_cmp (arg2, "dagger") && !str_cmp (arg, "copper"))
      vnum = 232;
   else if (!str_cmp (arg2, "spear") && !str_cmp (arg, "copper"))
      vnum = 233;
   else if (!str_cmp (arg2, "claw") && !str_cmp (arg, "copper"))
      vnum = 234;
   else if (!str_cmp (arg2, "mace") && !str_cmp (arg, "copper"))
      vnum = 235;
   else if (!str_cmp (arg2, "longsword") && !str_cmp (arg, "silver"))
      vnum = 236;
   else if (!str_cmp (arg2, "axe") && !str_cmp (arg, "silver"))
      vnum = 237;
   else if (!str_cmp (arg2, "flail") && !str_cmp (arg, "silver"))
      vnum = 238;
   else if (!str_cmp (arg2, "dagger") && !str_cmp (arg, "silver"))
      vnum = 239;
   else if (!str_cmp (arg2, "spear") && !str_cmp (arg, "silver"))
      vnum = 240;
   else if (!str_cmp (arg2, "claw") && !str_cmp (arg, "silver"))
      vnum = 241;
   else if (!str_cmp (arg2, "mace") && !str_cmp (arg, "silver"))
      vnum = 242;
   else if (!str_cmp (arg2, "longsword") && !str_cmp (arg, "gold"))
      vnum = 243;
   else if (!str_cmp (arg2, "axe") && !str_cmp (arg, "gold"))
      vnum = 244;
   else if (!str_cmp (arg2, "flail") && !str_cmp (arg, "gold"))
      vnum = 245;
   else if (!str_cmp (arg2, "dagger") && !str_cmp (arg, "gold"))
      vnum = 246;
   else if (!str_cmp (arg2, "spear") && !str_cmp (arg, "gold"))
      vnum = 247;
   else if (!str_cmp (arg2, "claw") && !str_cmp (arg, "gold"))
      vnum = 248;
   else if (!str_cmp (arg2, "mace") && !str_cmp (arg, "gold"))
      vnum = 249;
   else if (!str_cmp (arg2, "longsword") && !str_cmp (arg, "platinum"))
      vnum = 250;
   else if (!str_cmp (arg2, "axe") && !str_cmp (arg, "platinum"))
      vnum = 251;
   else if (!str_cmp (arg2, "flail") && !str_cmp (arg, "platinum"))
      vnum = 252;
   else if (!str_cmp (arg2, "dagger") && !str_cmp (arg, "platinum"))
      vnum = 253;
   else if (!str_cmp (arg2, "spear") && !str_cmp (arg, "platinum"))
      vnum = 254;
   else if (!str_cmp (arg2, "claw") && !str_cmp (arg, "platinum"))
      vnum = 255;
   else if (!str_cmp (arg2, "mace") && !str_cmp (arg, "platinum"))
      vnum = 256;
   else
   {
      send_to_char
	 ("Please specify which type of chimerical weapon you wish to make:\n\rLongsword Axe Flail Dagger Spear Claw Mace.\n\r",
	  ch);
      return;
   }
   if ((ch->pcdata->quest < 250) && !str_cmp (arg, "copper"))
   {
      send_to_char ("It costs 250 quest points to create a copper chimerical weapon.\n\r", ch);
      return;
   }
   else if ((ch->pcdata->quest < 500) && !str_cmp (arg, "silver"))
   {
      send_to_char ("It costs 500 quest points to create a silver chimerical weapon.\n\r", ch);
      return;
   }
   else if ((ch->pcdata->quest < 1000) && !str_cmp (arg, "gold"))
   {
      send_to_char ("It costs 1000 quest points to create a gold chimerical weapon.\n\r", ch);
      return;
   }
   else if ((ch->pcdata->quest < 2000) && !str_cmp (arg, "platinum"))
   {
      send_to_char("It costs 2000 quest points to create a platinum chimerical weapon.\n\r", ch);
      return;
   }
/*    if ( vnum == 0 || (pObjIndex = get_obj_index( vnum )) == NULL) */
   if (vnum == 0 || (obj = create_object (get_obj_index (vnum), 50)) == NULL)

   {
      send_to_char ("Missing object, please inform Nephesch.\n\r", ch);
      return;
   }
   if (!str_cmp (arg, "copper"))
   {
      ch->pcdata->quest -= 250;
      obj->points += 250;
      obj->value[1] = 10;
      obj->value[2] = 20;
   }
   else if (!str_cmp (arg, "silver"))
   {
      ch->pcdata->quest -= 500;
      obj->points += 500;
      obj->value[1] = 15;
      obj->value[2] = 30;
   }
   else if (!str_cmp (arg, "gold"))
   {
      ch->pcdata->quest -= 1000;
      obj->points += 1000;
      obj->value[1] = 20;
      obj->value[2] = 40;
   }
   else if (!str_cmp (arg, "platinum"))
   {
      ch->pcdata->quest -= 2000;
      obj->points += 2000;
      obj->value[1] = 25;
      obj->value[2] = 50;
   }
/*    obj = create_object(pObjIndex, 50); */
   SET_BIT (obj->quest, QUEST_RELIC);
   SET_BIT (obj->value[0], 18000);
   obj_to_char (obj, ch);
   act ("$p forms in your hands in an explosion of glamour.", ch, obj, NULL,
	TO_CHAR);
   act ("$p forms in $n's hands in an explosion of glamour.", ch, obj, NULL,
	TO_ROOM);
   return;
}

void affect_to_obj (OBJ_DATA * obj, int dur, int loc, int mod)
{
   AFFECT_DATA *paf;
   if (affect_free == NULL)
   {
      paf = alloc_perm (sizeof (*paf));
   }
   else
   {
      paf = affect_free;
      affect_free = affect_free->next;
   }

   paf->type = 0;
   paf->duration = dur;
   paf->modifier = mod;
   paf->location = loc;
   paf->bitvector = 0;
   paf->next = obj->affected;
   obj->affected = paf;
}

struct material_bonus
{
   char *name;
   int tohit;
   int todam;
   int ac;
};

struct location_bonus
{
   char *name;
   int location;
   int affect;
};

static struct material_bonus material_table[] = {
   {"copper", 3, 3, 50},
   {"silver", 5, 5, 20},
   {"gold", 10, 10, 5},
   {"platinum", 15, 15, 75},
   {"", 0, 0, 0,},
};

static struct location_bonus location_table[] = {
   {"ring", ITEM_WEAR_FINGER + ITEM_TAKE, 0},
   {"amulet", ITEM_WEAR_NECK + ITEM_TAKE, 0},
   {"breastplate", ITEM_WEAR_BODY + ITEM_TAKE, 10},
   {"cape", ITEM_WEAR_ABOUT + ITEM_TAKE, 0},
   {"helm", ITEM_WEAR_HEAD + ITEM_TAKE, 1},
   {"leggings", ITEM_WEAR_LEGS + ITEM_TAKE, 6},
   {"boots", ITEM_WEAR_FEET + ITEM_TAKE, 9},
   {"gauntlets", ITEM_WEAR_HANDS + ITEM_TAKE, 0},
   {"sleeves", ITEM_WEAR_ARMS + ITEM_TAKE, 11},
   {"belt", ITEM_WEAR_WAIST + ITEM_TAKE, 12},
   {"bracer", ITEM_WEAR_WRIST + ITEM_TAKE, 0},
   {"visor", ITEM_WEAR_FACE + ITEM_TAKE, 13},
   {"", 0, 0},
};

void do_craftarmour (CHAR_DATA * ch, char *argument)
{
   int i;
   int cost;
   int mat, loc;
   char arg1[MIL], arg2[MIL];
   char buf[MSL];
   OBJ_DATA *obj;

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

   if (!IS_CLASS (ch, CLASS_FAE))
   {
      do_rand_typo (ch);
      return;
   }
   if ((!IS_SET (ch->kith, KITH_BOGGAN)) && ((ch->pcdata->stats[UNI_GEN] > 2)))
   {
      send_to_char ("Only the boggan kiths and Gen 2 Fae can use this power.\n\r", ch);
      return;
   }

   if ((IS_CLASS (ch, CLASS_FAE)) && (!IS_SET (ch->kith, KITH_BOGGAN)) && ((ch->pcdata->stats[UNI_GEN] > 2)))
   {
      send_to_char ("Only the boggan kiths and Gen 2 Fae can use this power.\n\r", ch);
      return;
   }

   if (arg1[0] == '\0' || arg2[0] == '\0')
   {
      sprintf (buf, "%-12.12s %-12.12s %-12.12s %-12.12s\n\r", "Syntax:",
	       "CraftArmour", "Material", "Location");
      stc (buf, ch);
      for (i = 0; material_table[i].name[0] != '\0'; i++)
      {
	 sprintf (buf, "%-12.12s %-12.12s %-12.12s %-12.12s\n\r",
		  " ", " ", material_table[i].name, location_table[i].name);
	 stc (buf, ch);
      }
      for (; location_table[i].name[0] != '\0'; i++)
      {
	 sprintf (buf, "%-12.12s %-12.12s %-12.12s %-12.12s\n\r",
		  " ", " ", " ", location_table[i].name);
	 stc (buf, ch);
      }
      return;
   }

   for (i = 0; material_table[i].name[0] != '\0'; i++)
   {
      if (!str_cmp (material_table[i].name, arg1))
	 break;
   }
   if (material_table[i].name[0] == '\0')
   {
      stc ("Invalid Material.\n\r", ch);
      do_craftarmour (ch, "");
      return;
   }
   mat = i;

   switch (mat)
   {
   default:
   case 0:
      cost = 100;
      break;
   case 1:
      cost = 300;
      break;
   case 2:
      cost = 600;
      break;
   case 3:
      cost = 1500;
      break;
   }

   if (ch->pcdata->quest < cost)
   {
      stc ("You do not have enough quest points to create that!\n\r", ch);
      return;
   }


   for (i = 0; location_table[i].name[0] != '\0'; i++)
   {
      if (!str_cmp (location_table[i].name, arg2))
	 break;
   }
   if (location_table[i].name[0] == '\0')
   {
      stc ("Invalid Location.\n\r", ch);
      do_craftarmour (ch, "");
      return;
   }
   loc = i;

   obj = create_object (get_obj_index (OBJ_VNUM_PROTOPLASM), mat * 15);
   if (!obj)
   {
      stc ("Bug Please in form an immortals.\n\r", ch);
      return;
   }
   ch->pcdata->quest -= cost;
   obj->points = cost;
   SET_BIT (obj->quest, QUEST_RELIC);
   SET_BIT (obj->spectype, SITEM_FAE);
   obj->weight = 1;

   obj->condition = 100;
   obj->toughness = 100;
   obj->cost = mat * 10000;
   obj->item_type = ITEM_ARMOR;
   obj->value[0] = material_table[mat].ac;
   obj->value[3] = location_table[loc].affect;
   obj->wear_flags = location_table[loc].location;
   FILL_STRING (obj->questowner, ch->name);
   FILL_STRING (obj->questmaker, ch->name);

   sprintf (buf, "%s %s", material_table[mat].name, location_table[loc].name);
   FILL_STRING (obj->name, buf);
   sprintf (buf, "a %s chimerical %s", material_table[mat].name,
	    location_table[loc].name);
   FILL_STRING (obj->short_descr, buf);
   sprintf (buf, "a %s chimerical %s glows softly.",
	    material_table[mat].name, location_table[loc].name);
   FILL_STRING (obj->description, buf);

   affect_to_obj (obj, -1, APPLY_HITROLL, material_table[mat].tohit);
   affect_to_obj (obj, -1, APPLY_DAMROLL, material_table[mat].todam);

   act ("a ball of Glamour solidifies in your hands.", ch, NULL, NULL,
	TO_CHAR);
   act ("a ball of Glamour solidifies in $n's hands.", ch, NULL, NULL,
	TO_ROOM);

   act ("You mold a ball of Glamour into $p.", ch, obj, NULL, TO_CHAR);
   act ("$n molds a ball of Glamour into $p.", ch, obj, NULL, TO_ROOM);

   obj_to_char (obj, ch);

}