legend/
legend/area/
legend/player/
/***********************************************************************
 *       The wraith class file was written completly by Danlas         *
 *   This C written code is copyright of the Angels of Apocalypse      *
 *  And is not to be sold by any individual without permission of the  *
 *    owner.  If any questions arrise about the wraith class please    *
 *               contact me at danlas70@hotmail.com                    *
 ***********************************************************************/

#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "merc.h"
#include "player.h"
#include "wraith.h"

const char * arcanoi_name [11] =
{
    "Argos",             "Castigate",
    "Embody",            "Lifeweb",
    "Fatalism",          "Moliate",
    "Inhabit",           "Outrage",
    "Keening",           "Pandemonium",
    "Puppetry"
};


bool is_wraith( CHAR_DATA *ch )
{
	if ( IS_NPC(ch) ) return FALSE;
	if ( IS_CLASS(ch, CLASS_WRAITH))
	  return TRUE;
	else
	  return FALSE;
}

    
bool can_travel(CHAR_DATA *ch, CHAR_DATA *victim)
{
            
   if (IS_IMMORTAL(victim))
   {
      send_to_char("If they wanted your presence they'd command it.\n\r",ch);   
      return FALSE;
   }
   if (!IS_NPC(victim) && IS_SET(victim->immune, IMM_SUMMON) && victim->fight_timer > 0 )
   {
      stc("They dont currently require your presense,\n\r", ch);
      return FALSE;
   }
   if (IS_NPC(victim) && victim->level > 150)
   {
	stc("They are too powerful!\n\r", ch);
        return FALSE;
   }
   if (victim->in_room == ch->in_room)
   {
      send_to_char("But you're already there!\n\r",ch);
      return FALSE;
   }
 return TRUE;
}       

bool can_travel_obj(CHAR_DATA *ch, OBJ_DATA *obj)
{
                 
        if (obj->in_room == NULL)
        {
        stc("It is not in a room....\n\r",ch);
        return FALSE;
        }
    
 
   if ( IS_SET(obj->quest, QUEST_ARTIFACT) || IS_SET(obj->quest, ITEM_EQUEST)
        || IS_SET(obj->quest, QUEST_RELIC) )
   {
     act("You attempt to jump to $p, but it is unlocatable.",ch,obj,NULL,TO_CHAR);
     return FALSE;
   }
        
 return TRUE;
}
  

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

     if (!IS_IMMUNE(ch, IMM_WRAITH))
     {
	send_to_char( "You now allow a wraith to slay your humanly body.\n\r", ch ); 
	SET_BIT(ch->immune, IMM_WRAITH);
	return;
     }
     send_to_char( "Wraiths can no longer take your human body.\n\r", ch );
     REMOVE_BIT(ch->immune, IMM_WRAITH);
     return;
}

void do_fetter( 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_WRAITH) || ch->pcdata->stats[UNI_GEN] > 2)
	{
		send_to_char("Huh?\n\r", ch);
		return;
	}
    
    if ( arg[0] == '\0' )
    {
	send_to_char( "Slay 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 have no body to slay.\n\r", ch );
	return;
    }

    if (IS_CLASS(victim, CLASS_WRAITH))
    {
	send_to_char( "They have no body to slay.\n\r", ch );
	return;
    }

    if ( victim->level != LEVEL_AVATAR && !IS_IMMORTAL(victim) )
    {
	send_to_char( "You can only slay those not strong enough to resist death.\n\r", ch );
	return;
    }

	if (victim->class != 0) 
	{
	send_to_char("They have already chosen their path.\n\r", ch );
	return;
	}

    if (!IS_IMMUNE(victim,IMM_WRAITH))
    {
	send_to_char( "They do not allow you to slay their human body.\n\r", ch );
	return;
    }

    if (ch->exp < 100000)
    {
	send_to_char("You cannot afford the 100000 exp required to slay them.\n\r",ch);
	return;
    }

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

    ch->exp -= 100000;
    victim->exp -= 100000;

    act("You slay the body of $N and they become a wraith.", ch, NULL, victim, TO_CHAR);
    act("$n slays $N, making them a wraith.", ch, NULL, victim, TO_NOTVICT);
    act("$n slays your body and you become a wraith.", ch, NULL, victim, TO_VICT);
    victim->class    = CLASS_WRAITH;
    send_to_char( "You are now a wraith.\n\r", victim );
    free_string(victim->lord);
    free_string(victim->clan);
    victim->clan = str_dup(ch->clan);
    victim->lord = str_dup(ch->name);
    victim->pcdata->stats[UNI_GEN] = ch->pcdata->stats[UNI_GEN] + 1;
    save_char_obj(ch);
    save_char_obj(victim);
    return;
}

void do_manifest( 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_WRAITH ) )
    {
	send_to_char( "You do not have the ability to manifest.\n\r", ch);
	return;
    }

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

    if ( !IS_WRATED( ch, WRAT_DEATHPLANE) && IS_CLASS( ch, CLASS_WRAITH ) )
    {

	send_to_char( "You dissipate back into the realm of the dead.\n\r", ch );
	SET_BIT( ch->wbits, WRAT_DEATHPLANE );
	return;
    }

    else if ( IS_WRATED( ch, WRAT_DEATHPLANE ) && IS_CLASS( ch, CLASS_WRAITH ) )
    {
	send_to_char( "You fade into the realm of the living.\n\r", ch );
	REMOVE_BIT( ch->wbits, WRAT_DEATHPLANE );
	if ( IS_SET( ch->wbits, WRAT_ENSHROUD ) )
		REMOVE_BIT( ch->wbits, WRAT_ENSHROUD );
	return;
    }
}

void do_arcanoi( CHAR_DATA *ch, char *argument )
{
    char arg1[MAX_INPUT_LENGTH];
    char arg2[MAX_INPUT_LENGTH];
    char buf[MAX_STRING_LENGTH];
    int cost,disc;
    cost = 0;

    argument = one_argument( argument, arg1 );

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

    if (!IS_CLASS(ch, CLASS_WRAITH))
    {
	send_to_char( "Gibberish, nothing but gibberish.", ch );
	return;
    }
    if ( arg1[0] == '\0' )
    {
	stc( "#y++++++======------<<>><<>><<>><<>>#C Arcanoi #y<<>><<>><<>><<>>------======++++++#n\n\r", ch );
	sprintf( buf,"#y[*-*]       #CArgos #y[#e%s%s%s%s%s#y]     #CEmbody #y[#e%s%s%s%s%s#y]     #CFatalism #y[#e%s%s%s%s%s#y]       #y[*-*]#n\n\r",
			ch->arcanoi[WARGO] >= 1 ? "*" : " ",
                        ch->arcanoi[WARGO] >= 2 ? "*" : " ",
                        ch->arcanoi[WARGO] >= 3 ? "*" : " ",
                        ch->arcanoi[WARGO] >= 4 ? "*" : " ",
                        ch->arcanoi[WARGO] >= 5 ? "*" : " ",
			ch->arcanoi[WBODY] >= 1 ? "*" : " ",
                        ch->arcanoi[WBODY] >= 2 ? "*" : " ",
                        ch->arcanoi[WBODY] >= 3 ? "*" : " ",
                        ch->arcanoi[WBODY] >= 4 ? "*" : " ",
                        ch->arcanoi[WBODY] >= 5 ? "*" : " ",
			ch->arcanoi[WFATL] >= 1 ? "*" : " ",
                        ch->arcanoi[WFATL] >= 2 ? "*" : " ",
                        ch->arcanoi[WFATL] >= 3 ? "*" : " ",
                        ch->arcanoi[WFATL] >= 4 ? "*" : " ",
                        ch->arcanoi[WFATL] >= 5 ? "*" : " " );
	send_to_char( buf, ch );
	sprintf( buf, "#y[*-*]  #CInhabit#y [#e%s%s%s%s%s#y] #CKeening #y[#e%s%s%s%s%s#y] #CLifeweb #y[#e%s%s%s%s%s#y] #CMoliate#y [#e%s%s%s%s%s#y]  [*-*]\n\r",
			ch->arcanoi[WINHB] >= 1 ? "*" : " ",
                        ch->arcanoi[WINHB] >= 2 ? "*" : " ",
                        ch->arcanoi[WINHB] >= 3 ? "*" : " ",
                        ch->arcanoi[WINHB] >= 4 ? "*" : " ",
                        ch->arcanoi[WINHB] >= 5 ? "*" : " ",
			ch->arcanoi[WKEEN] >= 1 ? "*" : " ",
                        ch->arcanoi[WKEEN] >= 2 ? "*" : " ",
                        ch->arcanoi[WKEEN] >= 3 ? "*" : " ",
                        ch->arcanoi[WKEEN] >= 4 ? "*" : " ",
                        ch->arcanoi[WKEEN] >= 5 ? "*" : " ",
			ch->arcanoi[WLIFE] >= 1 ? "*" : " ",
                        ch->arcanoi[WLIFE] >= 2 ? "*" : " ",
                        ch->arcanoi[WLIFE] >= 3 ? "*" : " ",
                        ch->arcanoi[WLIFE] >= 4 ? "*" : " ",
                        ch->arcanoi[WLIFE] >= 5 ? "*" : " ",
			ch->arcanoi[WMATE] >= 1 ? "*" : " ",
                        ch->arcanoi[WMATE] >= 2 ? "*" : " ",
                        ch->arcanoi[WMATE] >= 3 ? "*" : " ",
                        ch->arcanoi[WMATE] >= 4 ? "*" : " ",
                        ch->arcanoi[WMATE] >= 5 ? "*" : " " );
	send_to_char( buf, ch );
	sprintf( buf, "#y[*-*]              #COutrage#y[#e%s%s%s%s%s#y]     #CPandemonium#y[#e%s%s%s%s%s#y]                [*-*]#n\n\r",
			ch->arcanoi[WRAGE] >= 1 ? "*" : " ",
                        ch->arcanoi[WRAGE] >= 2 ? "*" : " ",
                        ch->arcanoi[WRAGE] >= 3 ? "*" : " ",
                        ch->arcanoi[WRAGE] >= 4 ? "*" : " ",
                        ch->arcanoi[WRAGE] >= 5 ? "*" : " ",
			ch->arcanoi[WPAND] >= 1 ? "*" : " ",
                        ch->arcanoi[WPAND] >= 2 ? "*" : " ",
                        ch->arcanoi[WPAND] >= 3 ? "*" : " ",
                        ch->arcanoi[WPAND] >= 4 ? "*" : " ",
                        ch->arcanoi[WPAND] >= 5 ? "*" : " " );
	send_to_char( buf, ch );
	stc( "#y++++++======------<<>><<>><<>><<>>---------<<>><<>><<>><<>>------======++++++#n\n\r", ch );
	return;
    }
    if ( arg2[0] == '\0' )
    {
	if ( !str_prefix( arg1, "Argos" ) )
	{
	   if (ch->arcanoi[WARGO] == 0)
	   {
		stc( "You know nothing of this.\n\r", ch );
		return;
	   }
	   if (ch->arcanoi[WARGO] >= 1)
	   {
		divide_to_char(ch);
		centre_text( "Arcanoi Argos",ch);
		divide_to_char(ch);
		centre_text("Enshroud",ch);
	   }
	   if (ch->arcanoi[WARGO] >= 2)
		centre_text("Shadow Wings",ch);
           if (ch->arcanoi[WARGO] >= 3)
                centre_text("Flickering",ch);
           if (ch->arcanoi[WARGO] >= 4)
		centre_text("Jump",ch);
           if (ch->arcanoi[WARGO] >= 5)
		centre_text("Oubliette",ch);
	   divide_to_char(ch);
	   return;
	}

	if (!str_prefix( arg1, "Embody" ) )
	{
	   divide_to_char(ch);
	   centre_text( "Arcanoi Embody",ch);
	   divide_to_char(ch);
	   if (ch->arcanoi[WBODY] == 0)
	   	stc("Upkeep in the material plane costs you 250 move and 300 hp.\n\r", ch );
	   if (ch->arcanoi[WBODY] == 1)
		stc("Upkeep in the material plane costs you 200 move and 200 hp.\n\r",ch);
	   if (ch->arcanoi[WBODY] == 2)
		stc("Upkeep in the material plane costs you 175 move and 150 hp.\n\r",ch);
           if (ch->arcanoi[WBODY] == 3)
		stc("Upkeep in the material plane costs you 150 move and 100 hp.\n\r",ch);
           if (ch->arcanoi[WBODY] == 4)
		stc("Upkeep in the material plane costs you 100 move and 50 hp.\n\r",ch);
           if (ch->arcanoi[WBODY] == 5)
		stc("Upkeep in the material plane costs you 50 move and 25 hp.\n\r",ch);
	   divide_to_char(ch);
	   return;
	}
	if (!str_prefix( arg1, "Fatalism" ) )
	{
	   divide_to_char(ch);
	   centre_text( "Arcanoi Fatalism",ch);
	   divide_to_char(ch);
	   centre_text( "Hitroll and Damroll Bonus", ch);
	   if (ch->arcanoi[WFATL] == 0)
	   	centre_text("0", ch );
	   if (ch->arcanoi[WFATL] == 1)
		centre_text("50",ch);
	   if (ch->arcanoi[WFATL] == 2)
		centre_text("100",ch);
           if (ch->arcanoi[WFATL] == 3)
		centre_text("250",ch);
           if (ch->arcanoi[WFATL] == 4)
		centre_text("500",ch);
           if (ch->arcanoi[WFATL] == 5)
		centre_text("600",ch);
	   divide_to_char(ch);
	   return;
	}
	if (!str_prefix( arg1, "Inhabit" ) )
	{
	   if (ch->arcanoi[WINHB] == 0)
	   {
		stc( "You know nothing of this.\n\r", ch );
		return;
	   }
	   if (ch->arcanoi[WINHB] >= 1)
	   {
		divide_to_char(ch);
		centre_text( "Arcanoi Inhabit",ch);
		divide_to_char(ch);
		centre_text("Sense Grimlin",ch);
	   }
	   if (ch->arcanoi[WINHB] >= 2)
		centre_text("Gremlinize",ch);
           if (ch->arcanoi[WINHB] >= 3)
		centre_text("Empower",ch);
           if (ch->arcanoi[WINHB] >= 4)
		centre_text("Shellride",ch);
           if (ch->arcanoi[WINHB] >= 5)
		centre_text("Surge",ch);
	   divide_to_char(ch);
	   return;
	}
	if (!str_prefix( arg1, "Keening" ) )
	{
	   if (ch->arcanoi[WKEEN] == 0)
	   {
		stc( "You know nothing of this.\n\r", ch );
		return;
	   }
	   if (ch->arcanoi[WKEEN] >= 1)
	   {
		divide_to_char(ch);
		centre_text( "Arcanoi of Keening",ch);
		divide_to_char(ch);
		centre_text("Dirge",ch);
	   }
	   if (ch->arcanoi[WKEEN] >= 2)
		centre_text("Ballad",ch);
           if (ch->arcanoi[WKEEN] >= 3)
		centre_text("Requiem",ch);
           if (ch->arcanoi[WKEEN] >= 4)
		centre_text("Lullaby",ch);
           if (ch->arcanoi[WKEEN] >= 5)
		centre_text("Crescendo",ch);
	   divide_to_char(ch);
	   return;
	}
	if (!str_prefix( arg1, "Lifeweb" ) )
	{
	   if (ch->arcanoi[WLIFE] == 0)
	   {
		stc( "You know nothing of this.\n\r", ch );
		return;
	   }
	   if (ch->arcanoi[WLIFE] >= 1)
	   {
		divide_to_char(ch);
		centre_text( "Arcanoi Lifeweb",ch);
		divide_to_char(ch);
		centre_text("Cut Strand",ch);
	   }
	   if (ch->arcanoi[WLIFE] >= 2)
		centre_text("Web Sense",ch);
           if (ch->arcanoi[WLIFE] >= 3)
		centre_text("Splice Strand",ch);
           if (ch->arcanoi[WLIFE] >= 4)
		centre_text("Dead Sight",ch);
           if (ch->arcanoi[WLIFE] >= 5)
		centre_text("Soul Pact",ch);
	   divide_to_char(ch);
	   return;
	}
	if (!str_prefix( arg1, "Moliate" ) )
	{
	   if (ch->arcanoi[WMATE] == 0)
	   {
		stc( "You know nothing of this.\n\r", ch );
		return;
	   }
	   if (ch->arcanoi[WMATE] >= 1)
	   {
		divide_to_char(ch);
		centre_text( "Arcanoi Moliate",ch);
		divide_to_char(ch);
		centre_text("Imitate",ch);
	   }
	   if (ch->arcanoi[WMATE] >= 2)
		centre_text("Sculpt",ch);
           if (ch->arcanoi[WMATE] >= 3)
		centre_text("Martialry",ch);
           if (ch->arcanoi[WMATE] >= 4)
		centre_text("Rend",ch);
           if (ch->arcanoi[WMATE] >= 5)
		centre_text("Bodyshape",ch);
	   divide_to_char(ch);
	   return;
	}
	if (!str_prefix( arg1, "Outrage" ) )
	{
		divide_to_char(ch);
		centre_text( "Arcanoi Outrage",ch);
		divide_to_char(ch);
	   if (ch->arcanoi[WRAGE] == 0)
		centre_text("Damcap Bonus: 0", ch );
	   if (ch->arcanoi[WRAGE] == 1)
		centre_text("Damcap Bonus: 500",ch);
	   if (ch->arcanoi[WRAGE] == 2)
		centre_text("Damcap Bonus: 750",ch);
           if (ch->arcanoi[WRAGE] == 3)
		centre_text("Damcap Bonus: 1250",ch);
           if (ch->arcanoi[WRAGE] == 4)
		centre_text("Damcap Bonus: 1500",ch);
           if (ch->arcanoi[WRAGE] == 5)
		centre_text("Damcap Bonus: 2000",ch);
	   divide_to_char(ch);
	   return;
	}
	if (!str_prefix( arg1, "Pandemonium" ) )
	{
	   if (ch->arcanoi[WPAND] == 0)
	   {
		stc( "You know nothing of this.\n\r", ch );
		return;
	   }
	   if (ch->arcanoi[WPAND] >= 1)
	   {
		divide_to_char(ch);
		centre_text( "Arcanoi Pandemonium",ch);
		divide_to_char(ch);
		centre_text("Weirdness",ch);
	   }
	   if (ch->arcanoi[WPAND] >= 2)
		centre_text("Befuddlement",ch);
           if (ch->arcanoi[WPAND] >= 3)
		centre_text("Foul Humor",ch);
           if (ch->arcanoi[WPAND] >= 4)
		centre_text("Tempest Fugit",ch);
           if (ch->arcanoi[WPAND] >= 5)
		centre_text("Phenomenon",ch);
	   divide_to_char(ch);
	   return;
	}
    }

  if ( !str_cmp( arg2, "learn" ) )
  {
	if (!str_prefix( arg1, "Argos" ) )
	disc = WARGO;
	else if (!str_prefix( arg1, "Embody" ) )
  	disc = WBODY;
	else if (!str_prefix(arg1, "Fatalism" ) )
	disc = WFATL;
	else if (!str_prefix( arg1, "Inhabit" ) )
	disc = WINHB;
	else if (!str_prefix(arg1, "Keening" ) )
	disc = WKEEN;
	else if (!str_prefix( arg1, "Lifeweb" ) )
	disc = WLIFE;
	else if (!str_prefix(arg1, "Moliate" ) )
	disc = WMATE;
	else if (!str_prefix( arg1, "Outrage" ) )
	disc = WRAGE;
	else if (!str_prefix(arg1, "Pandemonium" ) )
	disc = WPAND;
	else
	{
	stc( "You must select from the following arcanoi:\n\r Argos, Embody, Fatalism, Inhabit, Keening, Lifeweb, Moliate, Outrage or Pandemonium.\n\r", ch);
	return;
	}
  }
  else
  {
	do_arcanoi(ch, "" );
	return;
  }

  cost = ( (ch->arcanoi[disc] + 1) * 10 );

  if (ch->arcanoi[disc] >= 5 )
  {
	stc( "You know everything about that arcanoi.\n\r", ch );
	return;
  }

  if (ch->practice < cost)
  {
	sprintf( buf, "You need %d primal to learn that.\n\r", cost );
	stc( buf, ch );	
	return;
  }
  ch->practice -= cost;
  ch->arcanoi[disc]++;
  stc( "You knowledge in the arcanoi increases.\n\r", ch );
  return;
}

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

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

	if (ch->arcanoi[WARGO] < 2 )
	{
	 stc("You are not skilled enough to use this.\n\r", ch);
	 return;
	}

	if (IS_SET( ch->wbits, WRAT_SWINGS))
	{
	 stc("Your shadow wings fade, then dissapear.\n\r", ch);
	 REMOVE_BIT( ch->affected_by, AFF_FLYING);
	 REMOVE_BIT( ch->wbits, WRAT_SWINGS);
	 return;
	}
	stc("Shadows emant from you, forming wings on your back.\n\r",ch);
	SET_BIT(ch->affected_by, AFF_FLYING);
	SET_BIT(ch->wbits, WRAT_SWINGS);
	return;
}

void do_requiem( 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_WRAITH))
	{
	 stc("Huh?\n\r",ch);
	 return;
	}

	if ( ch->arcanoi[WKEEN] < 3 )
	{
	 stc("You do not have the power to use requiem.\n\r",ch);
	 return;
	}

	if ( arg[0] == '\0' )
	{
	 stc("Whom do you wish to mortally wound?\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))
	{
	 stc("You cannot target other players.\n\r",ch);
	 return;
	}

	if ( victim->level > ( ch->max_hit / 94 ) )
	{
	 stc("You failed.\n\r",ch);
	 return;
	}
	stc( "You sing a deadly requiem.\n\r",ch);
	victim->hit = 1;
	WAIT_STATE(ch, 23);
	return;
}

void do_oubilette( 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_WRAITH))
	{
	 stc("Huh?\n\r", ch);
	 return;
	}

	if ( ch->arcanoi[WARGO] < 5 )
	{
	 stc("You are not skilled enough to use this.\n\r", ch);
	 return;
	}

	if (!IS_SET(ch->wbits, WRAT_DEATHPLANE))
	{
	 stc("You must be in the death plane to pull others into it.\n\r", ch);
	 return;
	}

	if ( arg[0] == '\0' )
	{
	 stc("Who do you wish to send to the death plane?\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("Just use manifest.\n\r",ch);
	 return;
	}

	
	if ( victim->level < 3 )
	{
	 stc("Pick on someone more powerful.\n\r",ch);
	 return;
	}

	if (IS_SET( victim->wbits, WRAT_DEATHPLANE ) )
	{
	 stc("You release them from the plane of death.\n\r",ch);
	 stc("You are released from the plane of the dead.\n\r",victim);
	 REMOVE_BIT( victim->wbits, WRAT_DEATHPLANE );
	 return;
	}
	stc("You pull them into the plane of death.\n\r",ch);
	stc("You are pulled into the plane of death.\n\r",victim);
	SET_BIT( victim->wbits, WRAT_DEATHPLANE );
	return;
}

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

	if (IS_NPC(ch))		return;

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

	if (ch->arcanoi[WMATE] < 5)
	{
	 stc("You do not know how to do this.\n\r",ch);
	 return;
	}

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

	if ( ch->hit == ch->max_hit && ch->mana == ch->max_mana && ch->move == ch->max_move )
	{
	 stc("You are in perfect condition.\n\r",ch);
	 return;
	}

	stc("You heal your bodyshape.\n\r",ch);
	ch->hit += 1200;
	ch->mana += 1000;
	ch->move += 1000;

	if ( ch->hit > ch->max_hit )
	 ch->hit = ch->max_hit;
	if ( ch->mana > ch->max_mana )
	 ch->mana = ch->max_mana;
	if ( ch->move > ch->max_move )
	 ch->move = ch->max_move;
	update_pos(ch);
	WAIT_STATE( ch, 23 );
	return;
}

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

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

	if (ch->arcanoi[WKEEN] < 2 )
	{
	 stc("You do not know how to do this.\n\r",ch);
	 return;
	}

	if (IS_SET(ch->wbits, WRAT_BALLAD))
	{
	 stc("You remove the power of the ballad from yourself.\n\r",ch);
	 REMOVE_BIT( ch->wbits, WRAT_BALLAD);
	 return;
	}
	stc("You sing a wondrous ballad.\n\r",ch);
	SET_BIT( ch->wbits, WRAT_BALLAD );
	return;
}

void do_soulpact( 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_WRAITH))
	{
	 stc("Huh?\n\r",ch);
	 return;
	}

	if (ch->arcanoi[WLIFE] < 5 )
	{
	 stc("You do not know how to do this.\n\r",ch);
	 return;
	}

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

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

	if ( ch == victim )
	{
	 stc("You cannot use this on yourself.\n\r",ch);
	 return;
	}

	if (IS_NPC(victim))
	{
	 stc("You must target other players.\n\r",ch);
	 return;
	}

	if (victim->hit > 0 )
	{
	 stc("They must be weaker to do this.\n\r", ch);
	 return;
	}

	stc("You heal them at your own cost...\n\r",ch);
	act("$n heals you, their strength withering as they do.\n\r", ch, NULL, victim, TO_VICT );
	free_string( victim->pcdata->soulpacted );
	victim->pcdata->soulpacted = str_dup( ch->name );
	victim->hit = victim->max_hit;
	ch->hit = -10;
	ch->mana = 0;
	ch->move = 0;
	update_pos( ch );
	update_pos( victim );
	return;
}

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

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

	if (ch->arcanoi[WINHB] < 1 )
	{
	 stc("You do not have the power to do that.\n\r",ch);
	 return;
	}

	if (IS_SET( ch->wbits, WRAT_SENSE))
	{
	 stc("You no longer sense other wraiths.\n\r",ch);
	 REMOVE_BIT( ch->wbits, WRAT_SENSE);
	 return;
	}

	stc("You can now see other wraiths.\n\r",ch);
	SET_BIT( ch->wbits, WRAT_SENSE);
	return;
}

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

	if (IS_NPC(ch))		 return;

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

	if ( ch->arcanoi[WARGO] < 1 )
	{
	 stc("You do not know how to hide yourself in the plane of death.\n\r",ch);
	 return;
	}

	if ( ch->fight_timer > 0 )
	{
 	 stc("Not with a fight timer.\n\r", ch);
	 return;
	}

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

	if ( !IS_SET( ch->wbits, WRAT_DEATHPLANE ))
	{
	 stc("You can only hide yourself in the death plane.\n\r",ch);
	 return;
	}

	if ( IS_SET( ch->wbits, WRAT_ENSHROUD ) )
	{
	 stc("You are now visible to mortal eyes.\n\r",ch);
	 REMOVE_BIT( ch->wbits, WRAT_ENSHROUD);
	 return;
	}

	stc("You fade out of existance.\n\r",ch);
	SET_BIT( ch->wbits, WRAT_ENSHROUD );
	return;
}

void do_wflicker( 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_WRAITH))
    {
       send_to_char("Huh?\n\r",ch);
       return;
    }
  
    if ( arg[0] == '\0' )
    {
	send_to_char( "Flicker to whom?\n\r", ch );
	return;
    }

    if ( ch->arcanoi[WARGO] < 3 )
    {
        send_to_char("You do not have the power to do this.\n\r",ch);
	return;
    }

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


  if ( IS_NPC(victim) && !can_travel(ch,victim))
  {
	send_to_char("You cannot flicker to them.\n\r", ch );
	return;
  }

  if ( !IS_NPC(victim) && ( !can_travel(ch,victim) && str_cmp(victim->pcdata->soulpacted, ch->name)))
  {
       send_to_char("They are in their castle.\n\r", ch);
       stc("If only you controlled part of their soul...\n\r", ch);
       return;
  }

/*
  if ( can_travel(ch,victim) && (IS_NPC(victim) || victim->pcdata->soulpacted != NULL || (str_cmp(victim->pcdata->soulpacted, ch->name
))))
       {
       send_to_char( "They are in their castle.\n\r", ch);
       send_to_char("If only you controlled part of their soul...\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;
    }
    if (IS_IMMORTAL( victim ) )
    {
      send_to_char("Not to archangels.",ch);
      return;
    }
    if (!IS_NPC(victim) && !str_cmp(victim->pcdata->soulpacted, ch->name))
    {
       free_string( victim->pcdata->soulpacted );
    }
    act("$n flickers into the darkness.\n\r", ch, NULL, victim, TO_NOTVICT );
    char_from_room(ch);
    char_to_room(ch,victim->in_room);
    act("The shadows flicker and $n appears.\n\r", ch, NULL, victim, TO_NOTVICT );
    stc( "You flicker into the room.\n\r", ch );
    do_look(ch,"auto");  
    return;
}

void do_jump( CHAR_DATA *ch, char *argument )
{
  OBJ_DATA *obj;
  char arg1[MAX_INPUT_LENGTH];

  argument = one_argument(argument, arg1);

  if ( IS_NPC(ch) ) return;


  if ( ch->arcanoi[WARGO] < 4 )
  {
   stc("You do not have the power to do this.\n\r", ch );
   return;
  }

  if ( arg1[0] == '\0' )
  {
    stc("What object do you want to attempt to jump to?\n\r",ch);
    return;
  }

  if ( ( obj = get_obj_world( ch, arg1 ) ) == NULL )
  {
    stc("You concentrate deeply on foreign planes, but can find no such object.\n\r",ch);
    return;
  }

   if ( obj->in_obj != 0 )
   {
   act("You attempt to jump to $p, but it is contained.\n\r" ,ch,obj,NULL,TO_CHAR);
   return;
   }
   
   if ( obj->in_room == NULL )
   {
     act("You attempt to jump to $p, but it seems to be possessed by another.",ch,obj,NULL,TO_CHAR);
     return;
   }

  if (!can_travel_obj(ch,obj))
  {
     return;
  }

    stc("You jump to the object.\n\r", ch );
    act("$n flickers and fades out of sight.",ch,obj,NULL,TO_ROOM);
    char_from_room(ch);
    char_to_room( ch, obj->in_room );
    act("$n leaps into the room.",ch,obj, NULL, TO_ROOM );
    do_look( ch, "auto" );
  return;

}

void do_lullaby( 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_WRAITH ))
	{
	 stc("Huh?\n\r", ch );
	 return;
	}

	if ( ch->arcanoi[WKEEN] < 4 )
	{
	 stc("You do not have that power yet.\n\r", ch );
	 return;
	}

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

	if ( ( victim = get_char_room( ch, arg ) ) == NULL )
    	{
	 send_to_char( "They are not here.\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->position == POS_FIGHTING )
	{
	 stc("Not during a fight!\n\r", ch);
	 return;
	}

	stc("You sing a wondrous lullaby and they fall asleep.\n\r", ch );
	stc("You hear a lullaby and quickly doze off...\n\r", victim );
	victim->position = POS_SLEEPING;
	WAIT_STATE( ch, 60 );
	WAIT_STATE( victim, 11 );
	return;
}

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

	CHAR_DATA *victim;
	char arg[MAX_INPUT_LENGTH];
	char buf[MAX_STRING_LENGTH];

	argument = one_argument( argument, arg );

	if (IS_NPC(ch))		return;


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

	if (!IS_NPC(ch) &&  ch->arcanoi[WKEEN] < 1 )
	{
	 stc("You do not have the ability to do this yet.", ch );
	 return;
	}

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

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

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

        if ( ch->position == POS_FIGHTING  && !IS_NPC(ch))
        {
         send_to_char( "Not while fighting!\n\r", ch );
	 return;
	}
/*
        if (ch->mana < ch->max_mana && !IS_NPC(ch))
        {
        stc("You require more magic for this skill!\n\r",ch);
        return;
        }

*/	if ( victim->dirgetimer > 0 )
	{
	 send_to_char("But they are already full of sorrow.\n\r", ch );
	 return;
	}

	if (is_safe( ch, victim ))	return;

	stc("You sing a wondrous dirge, filling their heart with sorrow.\n\r", ch );
	victim->dirgetimer += ch->arcanoi[WKEEN];
	if ( IS_NPC(ch)) victim->dirgetimer += 5;
	sprintf( buf, "%s sings a wondrous dirge, and fills your heart with sorrow.\n\r", ch->name );
	stc( buf, victim );
	stc("You are temporarily frozen.\n\r", victim );
        WAIT_STATE(victim,75 / (7 - ch->arcanoi[WKEEN]));
	//ch->mana = 0;
	return;
}

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

	if (IS_NPC(ch))		return;

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

	if ( ch->arcanoi[WLIFE] < 4 )
	{
	 stc("You don't have the power to do that.\n\r", ch );
	 return;
	}

	if ( IS_SET( ch->wbits, WRAT_SEVERED ))
	{
	 stc("The strand that composes your life can now be read.\n\r", ch );
	 REMOVE_BIT( ch->wbits, WRAT_SEVERED );
	 return;
	}

	SET_BIT( ch->wbits, WRAT_SEVERED );
	stc("You cut the strand that composes your life from the mortal realm.", ch );
	return;
}

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

	CHAR_DATA *victim;
	char buf[MAX_STRING_LENGTH];
	char arg[MAX_INPUT_LENGTH];
	int damage;

	argument = one_argument( argument, arg );

	if (IS_NPC(ch))		return;

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

	if ( ch->arcanoi[WKEEN] < 5 )
	{
	 stc("You do not have this power yet.\n\r", ch );
	 return;
	}

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

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

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

	if ( is_safe(ch, victim ))
	 return;

	damage = (( ch->damroll * 2 ) * ch->arcanoi[WKEEN] );
	if ( damage > 6500 )
		damage = 6500;
	sprintf( buf, "#rYour shrieking crescendo tears #g%s. #n[#g%d#n]\n\r",
			victim->name,
			damage );
	stc( buf, ch );
	sprintf( buf, "#g%s's #rshrieking crescendo tears you. #n[#r%d#n]\n\r",
			ch->name,
			damage );
	stc( buf, victim );
	victim->hit -= damage;
	multi_hit( ch, victim, TYPE_UNDEFINED );
	WAIT_STATE( ch, 24 );
	return;
}

void do_weirdness(CHAR_DATA *ch, char *argument)
{
    DESCRIPTOR_DATA     *d;
    CHAR_DATA           *victim;
    CHAR_DATA           *ach;
    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_WRAITH) )   
    {
        stc("Huh?\n\r", ch);   
        return;
    }
    if ( ch->arcanoi[WPAND] < 1 )
    {
        send_to_char("You require Pandemonium 1 to use weirdness\n\r", ch);
        return;
    }
        
    if ( arg[0] == '\0' && ch->fighting == NULL )
    {   
        send_to_char( "Who do you wish to use weirdness on?\n\r", ch );   
        return;
    }
 
    if ( ( victim = ch->fighting ) == NULL )
    {
        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 are weird enough. Freak.\n\r", ch );
        return;
    }
    
    if ( is_safe( ch, victim ) )
        return;
     
    if ( IS_ITEMAFF( victim, ITEMA_ICESHIELD ) ) 
    {
        send_to_char( "You failed.\n\r", ch );
        return;
    }
    
    if ( ( sn = skill_lookup( "chill touch" ) ) < 0 )
    {
        send_to_char( "Bugged, please inform an Imp.\n\r", ch );
        return;
    }
            
    for( d = first_descriptor ; d != NULL ; d = d->next )
    {
        if ( d->connected != CON_PLAYING ) continue;
        if ( ( ach = d->character ) == NULL ) continue;
        if ( ch->in_room == NULL || ach->in_room == NULL ) continue;
        if ( ach->in_room->area != ch->in_room->area ) continue;
        
        if ( ach == ch )
            send_to_char( "You cackle gleefully.\n\r", ch );
        else if ( ach->in_room == ch->in_room )
            act( "$n cackles gleefully, you suddnely feel cold .", ch, NULL, victim, TO_ROOM );
        else
            send_to_char( "The air suddenly freezes.\n\r", ch );
    }
            
    spelltype = skill_table[sn].target;
    level = ch->spl[spelltype] * 5;
    (*skill_table[sn].spell_fun) ( sn, level, ch, victim );
    WAIT_STATE( ch, 6 );
    WAIT_STATE( victim, 12);
    return;
}

void do_befuddlement( CHAR_DATA *ch, char *argument )
{
	CHAR_DATA *victim;
	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_WRAITH ))
	{
	 stc("Huh?\n\r", ch );
	 return;
	}

	if ( ch->arcanoi[WPAND] < 2 )
	{
	 stc("You cannot do this yet.\n\r", ch );
	 return;
	}

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

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

	if ( ch == victim )
	{
	 stc("Are you good at confusing yourself?\n\r", ch );
	 return;
	}

	if ( ch->position != POS_FIGHTING && victim->position != POS_FIGHTING )
	{
	 stc("You must be fighting them to use this.\n\r", ch );
	 return;
	}

	if ( is_safe( ch, victim ))
	 return;

	stc("You try to confuse your opponent and make them flee.\n\r", ch );
	sprintf( buf, "%s is confusing you!.\n\r", ch->name );
	stc( buf, victim );
	do_flee( victim, "" );
	do_flee( victim, "" );
	WAIT_STATE( ch, 7 );
	WAIT_STATE( victim, 11 );
	return;
}

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

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

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

if ( ch->arcanoi[WMATE] < 2 )
{
 stc("You do not have the power to do this.\n\r", ch );
 return;
}
if (arg[0] == '\0')
{
  stc("Sculpt what?\n\r", ch);
  stc("\tWraith's Touch (touch) (60 Primal)\n\r", ch);
  stc("\tDeath's Brush  (brush) (750 Primal and 100 million exp)\n\r", ch);
  return;
}

if (!str_cmp(arg, "brush") )
{
   if (ch->practice < 750)
   {
	stc("That costs 750 primal\n\r", ch);
	return;
   }
   if (ch->exp < 100000000)
   {
	stc("That costs 100 million exp!\n\r", ch);
	return;
   }
   ch->practice -= 750;
   ch->exp -= 100000000;
   obj = create_object(get_obj_index(29689 ), 0);
   obj->level = 60;
if (obj->questmaker != NULL) free_string(obj->questmaker);
obj->questmaker = str_dup(ch->name);
obj_to_char(obj,ch);
act("$p appears in your hand.", ch, obj, NULL, TO_CHAR);
act("$p appears in $n's hand.", ch, obj, NULL, TO_ROOM);
return;
}

else if (!str_cmp(arg, "touch"))
{
  if (ch->practice < 60)
  {
	stc("That costs 60 primal!\n\r", ch);
        return;
  } 
ch->practice -= 60;
obj = create_object(get_obj_index( 29690 ), 0);
obj->level = 60;
obj->value[3] = 5;

if (obj->questmaker != NULL) free_string(obj->questmaker);
obj->questmaker = str_dup(ch->name);
obj_to_char(obj,ch);
act("$p appears in your hand.", ch, obj, NULL, TO_CHAR);
act("$p appears in $n's hand.", ch, obj, NULL, TO_ROOM);
return;
}
else
{ do_sculpt(ch, "");
  return;
}
return;
}

void do_martialry (CHAR_DATA * ch, char *argument)
{
   char arg1[MAX_INPUT_LENGTH];
      
   smash_tilde (argument);
   argument = one_argument (argument, arg1);
      
   if (IS_NPC (ch))
      return;
      
   if (!IS_CLASS (ch, CLASS_WRAITH))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (ch->arcanoi[WMATE] < 3)
   {
      send_to_char ("You need level 3 in Moliate to use Martialry.\n\r", ch);
      return;
   }
            
   if (arg1[0] == '\0')
   {
      send_to_char ("Syntax: martialry <modification>\n\r", ch);
      send_to_char ("Horns, Head, Exoskeleton, Tail\n\r", ch);
      return;
   }
   /*
    * Set something.
    */
   if (!str_cmp (arg1, "horns"))
   {
 
      if (!IS_VAMPAFF (ch, VAM_HORNS))
      {
         SET_BIT (ch->pcdata->stats[UNI_AFF], VAM_HORNS);
         send_to_char ("You pull a set of horns out of your head.\n\r", ch);
         act ("$n pulls a set of horns from his head!\n\r", ch, NULL, NULL,
              TO_ROOM);
         return;
      }
   
      if (IS_VAMPAFF (ch, VAM_HORNS))
      {
         REMOVE_BIT (ch->pcdata->stats[UNI_AFF], VAM_HORNS);
         send_to_char ("You push your horns back into your head.\n\r", ch);
         act ("$n pushes $n's horns back into $n head.\n\r", ch, NULL, NULL,
              TO_ROOM);
         stc ("You are no longer horny.\n\r", ch);
         return;
    
      }
   }
   if (!str_cmp (arg1, "exoskeleton"))
   {
      
      if (!IS_VAMPAFF (ch, VAM_EXOSKELETON))
      {
         SET_BIT (ch->pcdata->stats[UNI_AFF], VAM_EXOSKELETON);
         send_to_char ("Your skin is covered by a hard exoskeleton.\n\r", ch);
         act ("$n's skin is covered by a hard exoskeleton!\n\r", ch, NULL,
              NULL, TO_ROOM);   
         return;
      }
      
      if (IS_VAMPAFF (ch, VAM_EXOSKELETON))
      {
         REMOVE_BIT (ch->pcdata->stats[UNI_AFF], VAM_EXOSKELETON);
         send_to_char
            ("Your exoskeleton slowly disappears under your skin.\n\r", ch);
         act ("$n's hard exoskeleton disappears under $s skin.\n\r", ch, NULL,
              NULL, TO_ROOM);
         return;
      
      }
   }
         
   if (!str_cmp (arg1, "tail"))
   {
         
      if (!IS_VAMPAFF (ch, VAM_TAIL))
      {
         SET_BIT (ch->pcdata->stats[UNI_AFF], VAM_TAIL);
         send_to_char
            ("Your spine extends out into a long, pointed tail.\n\r", ch);
         act ("$n's spine extends to form a long pointed tail!\n\r", ch, NULL,
              NULL, TO_ROOM);
         return;
      }
      if (IS_VAMPAFF (ch, VAM_TAIL))
      {
         REMOVE_BIT (ch->pcdata->stats[UNI_AFF], VAM_TAIL);
         send_to_char ("Your tail slowly retracts into your spine.\n\r", ch);
         act ("$n's tail shrinks and vanishes into $s spine.\n\r", ch, NULL,
              NULL, TO_ROOM);
         return;
       
      }
   }
            
   if (!str_cmp (arg1, "head"))
   {
         
      if (!IS_VAMPAFF (ch, VAM_HEAD))
      {
         SET_BIT (ch->pcdata->stats[UNI_AFF], VAM_HEAD);
         send_to_char ("Your head transforms into that of a fierce lion.\n\r",
                       ch);
         act ("$n's head transforms into that of a fierce lion!\n\r", ch,
              NULL, NULL, TO_ROOM);
         return;
      }
         
      if (IS_VAMPAFF (ch, VAM_HEAD))
      {
         REMOVE_BIT (ch->pcdata->stats[UNI_AFF], VAM_HEAD);
         send_to_char ("Your head slowly resumes it's normal form.\n\r", ch);
         act ("$n's head resumes its normal form.\n\r", ch, NULL, NULL,
              TO_ROOM);
         return;
      
      }
   }
         
   /*
    * Generate usage message.
    */
   do_martialry (ch, "");
   return;
}   
void do_gremlinize( CHAR_DATA *ch, char *argument )
{
    char arg[MAX_INPUT_LENGTH];
    char buf[MAX_STRING_LENGTH];
    OBJ_DATA *obj;
    CHAR_DATA *mount;

    sprintf(buf,"%s: Oswitch %s",ch->name,argument);
    if (ch->level < NO_WATCH) do_watching(ch,buf);

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

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

    if ( ch->arcanoi[WINHB] < 2 )
    {
	stc("You do not have this power yet.\n\r", ch );
	return;
    }

    if ( IS_EXTRA(ch, EXTRA_OSWITCH))
    {
         sprintf(buf,"%s: Oreturn",ch->name);
    if (ch->level < NO_WATCH) do_watching(ch,buf);
    if ( ( obj = ch->pcdata->chobj ) != NULL ) obj->chobj = NULL;
    ch->pcdata->chobj = NULL;
    REMOVE_BIT(ch->affected_by, AFF_POLYMORPH);
    REMOVE_BIT(ch->extra, EXTRA_OSWITCH);
    if (IS_HEAD(ch,LOST_HEAD)) REMOVE_BIT(ch->loc_hp[0], LOST_HEAD);
    free_string(ch->morph);
    ch->morph = str_dup("");
    char_from_room(ch);
    char_to_room(ch,get_room_index(ROOM_VNUM_ALTAR));
    send_to_char( "Ok.\n\r", ch );
    return;
    }
    if ( ch->fight_timer > 0 )
    {
	stc("Not with a fight timer!\n\r", ch );
	return;
    }

    if ( arg[0] == '\0' )
    {
	send_to_char( "Switch into what?\n\r", ch );
	return;
    }

    if ( IS_EXTRA(ch, EXTRA_OSWITCH) || IS_HEAD(ch,LOST_HEAD) )
    {
	send_to_char( "You are already oswitched.\n\r", ch );
	return;
    }

    if ( IS_AFFECTED(ch, AFF_POLYMORPH) )
    {
	send_to_char( "Not while polymorphed.\n\r", ch );
	return;
    }

    if ( IS_NPC(ch) || IS_EXTRA(ch,EXTRA_SWITCH) )
    {
	send_to_char( "Not while switched.\n\r", ch );
	return;
    }

    if ( ( obj = get_obj_room( ch, arg ) ) == NULL )
    {
	send_to_char( "They aren't here.\n\r", ch );
	return;
    }
    if (strlen(obj->questowner) > 2)
    {
	stc("Not on that object!\n\r", ch);
	return;
    }
    if ( obj->chobj != NULL )
    {
	send_to_char( "Object in use.\n\r", ch );
	return;
    }

    if ( (mount = ch->mount) != NULL) do_dismount(ch,"");
    obj->chobj = ch;
    ch->pcdata->chobj = obj;
    SET_BIT(ch->affected_by, AFF_POLYMORPH);
    SET_BIT(ch->extra, EXTRA_OSWITCH);
    free_string(ch->morph);
    ch->morph = str_dup(obj->short_descr);
    send_to_char( "Ok.\n\r", ch );
    return;
}

void do_wempower( CHAR_DATA *ch, char *argument )
{
 OBJ_DATA *obj;
 AFFECT_DATA *paf;

 if (IS_NPC(ch))	return;

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

 if ( ch->arcanoi[WINHB] < 3 )
 {
	stc("You do not have that power yet.\n\r", ch );
	return;
 }

 if ( argument[0] == '\0' )
 {
        send_to_char( "Empower which object?\n\r", ch );
        return;
 }

    if ( ( obj = get_obj_carry( ch, argument ) ) == NULL )
    {
        send_to_char( "You don't have that.\n\r", ch );
        return;
    }

 if (IS_SET( obj->quest, QUEST_ENCHANTED ))
 {
	stc("This item has already been empowered.\n\r", ch );
	return;
 }

 if ( ch->practice < 40 )
 {
	stc("This requires 40 primal.\n\r", ch );
	return;
 }
 if (!IS_SET( obj->quest, QUEST_ENCHANTED ))
 {
    if ( affect_free == NULL )
    {
	paf		= alloc_perm( sizeof(*paf) );
    }
    else
    {
	paf		= affect_free;
	affect_free	= affect_free->next;
    }
//    paf->type		= sn;
    paf->duration	= -1;
    paf->location	= APPLY_HITROLL;
    paf->modifier	= 5;
    paf->bitvector	= 0;
    paf->next		= obj->affected;
    obj->affected	= paf;

    if ( affect_free == NULL )
    {
	paf		= alloc_perm( sizeof(*paf) );
    }
    else
    {
	paf		= affect_free;
	affect_free	= affect_free->next;
    }
//    paf->type		= sn;
    paf->duration	= -1;
    paf->location	= APPLY_DAMROLL;
    paf->modifier	= 5;
    paf->bitvector	= 0;
    paf->next		= obj->affected;
    obj->affected	= paf;
    act("You create a #0dark aura#n around $p.", ch,obj, NULL, TO_CHAR);
    act("$n creates a #0dark aura#n around $p.", ch,obj, NULL, TO_ROOM);
    ch->practice -= 40;
    SET_BIT( obj->quest, QUEST_ENCHANTED );
    return;
   }
}

void do_imitate( 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_WRAITH))
	{
	 stc("Huh?\n\r", ch);
	 return;
	}

	if ( ch->arcanoi[WMATE] < 1 )
	{
	 stc("You cannot use this skill yet.\n\r", ch );
	 return;
	}

	if ( arg[0] == '\0' && IS_SET( ch->affected_by, AFF_POLYMORPH) )
	{
	 stc("You shift back into your normal form.\n\r", ch );
	 REMOVE_BIT( ch->affected_by, AFF_POLYMORPH );
	 ch->morph = NULL;
	 return;
	}
	else if ( arg[0] == '\0' )
	{
	 stc("Imitate who?\n\r", ch );
	 return;
	}

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

	if ( !IS_NPC(victim))
	{
	 stc("You can only imitate NPCs.\n\r", ch );
	 return;
	}
	stc("You have transformed!\n\r", ch );
	free_string( ch->morph );
    	SET_BIT(ch->affected_by, AFF_POLYMORPH); 
	ch->morph = str_dup( victim->short_descr );
	return;
}

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

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

 if (ch->arcanoi[WPAND] < 1 )
 {
	stc("You are not able to use this power yet.\n\r", ch );
	return;
 }

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

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

 if ( ch == victim )
 {
	stc("That would show your meager intelligence.\n\r", ch );
	return;
 }

 act("Your tempest slows $N!\n\r",ch,NULL,victim,TO_CHAR);
 act("$n uses his tempest powers and slows you.\n\r",ch,NULL,victim,TO_VICT);
 WAIT_STATE( victim, 21 );
 WAIT_STATE( ch, 9 );
 return;
}

void do_foulhumor(CHAR_DATA *ch, char *argument)
{
 CHAR_DATA *victim;
 CHAR_DATA *mob;
 char arg[MIL];
 char buf[MSL];
 
 argument = one_argument(argument, arg);


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

	if (!IS_NPC(ch) && ch->arcanoi[WPAND] < 1 )
	{
	 stc("You are not skilled enough to use this.\n\r", ch);
	 return;
	}

	if (arg[0] == '\0' )
	{
	 stc("Whom do you want your vermin to attack?\n\r",ch);
	 return;
	}
	
	if ( ch->position != POS_FIGHTING )
	{
	 stc("You must be fighting to summon vermin!\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("That would be interesting.\n\r",ch);
	 return;
	}

	if (ch->fighting == victim)
	{
	    mob=create_mobile( get_mob_index( 30001) );
	    mob->level =ch->max_hit / 100;
	 if (ch->max_hit < 200000 )
	 {
 	    mob->hit = ch->max_hit;
 	    mob->max_hit = ch->max_hit;
	    mob->hitroll = 1000;
    	    mob->damroll = 1000;
	    mob->armor = -700;
    	 }
	 else if ( ch->max_hit >= 200000 && ch->max_hit < 500000 )
	 {
	   mob->hit = ch->max_hit * 2;
	   mob->max_hit = ch->max_hit * 2;
	   mob->hitroll = 3500;
	   mob->damroll = 3500;
	   mob->armor = -2000;
	 }
	 else if (ch->max_hit >= 500000 && ch->max_hit < 1000000 )
	 {
	   mob->hit = ch->max_hit * 3;
	   mob->max_hit = ch->max_hit * 3;
	   mob->hitroll = 7000;
	   mob->damroll = 7000;
	   mob->armor = -3500;
	 }
	 else if (ch->max_hit >= 1000000 )
	 {
	   mob->hit = ch->max_hit * 4;
	   mob->max_hit = ch->max_hit * 4;
	   mob->hitroll = 10000;
	   mob->damroll = 10000;
	   mob->armor = -6000;
	 }
            SET_BIT(mob->act, ACT_NOEXP);
            free_string(mob->name);
            mob->name =str_dup("gremlin");
            free_string(mob->short_descr);
            mob->short_descr = str_dup("a small gremlin");
            free_string(mob->long_descr);
            mob->long_descr = str_dup("a small gremlin, attacks you with its large claws");
	    char_to_room( mob, ch->in_room );
	    stc("A gremlin steps out of the darkness and bows to your will.\n\r", ch );
	    act("A gremlin steps out of the shadows and attacks $N!\n\r",ch,NULL,victim,TO_ROOM);
	    sprintf(buf, "%s", victim->name);
	    multi_hit(mob,victim,TYPE_UNDEFINED);
	    WAIT_STATE(ch, 48);
	    return;
	}
	else
	{
	 stc("You are not fighting them!\n\r", ch);
	 return;
	}
}

void do_surge( CHAR_DATA *ch, char *argument)
{
 CHAR_DATA *victim;
 OBJ_DATA *obj;
 char arg[MIL];
 char buf[MSL];

    argument = one_argument( argument, arg );

 	if (IS_NPC(ch))	return;


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

        if ( ch->arcanoi[WINHB] < 5 && !IS_IMMORTAL(ch))
        {
         stc("You do not have the power to use surge.\n\r",ch);
         return;
        }

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

  	if ( ( obj = get_obj_room( ch, arg ) ) == NULL )
	{
	 stc("I do not see that object anywhere.\n\r",ch);
	 return;
	}

	if (obj->chobj == NULL )
	{
	 stc("But this item is not possessed!\n\r",ch);
	 return;
	}

	victim = obj->chobj;
    if ( ( obj = victim->pcdata->chobj ) != NULL ) obj->chobj = NULL;
    victim->pcdata->chobj = NULL;
    if (victim->pcdata->obj_vnum == 29662 ||
	victim->pcdata->obj_vnum == 29663 ||
	victim->pcdata->obj_vnum == 30055 )
    {
	extract_obj(obj);
    }
    victim->pcdata->obj_vnum = 0;
    REMOVE_BIT(victim->affected_by, AFF_POLYMORPH);
    REMOVE_BIT(victim->extra, EXTRA_OSWITCH);
    free_string(ch->morph);
    ch->morph = str_dup("");
    sprintf(buf,"You send a surge through %s, returning them to human form.\n\r", victim->name );
    stc(buf,ch);
    stc("You feel a surge as you are returned to your human form!\n\r", victim);
    return;
}

void do_shellride(CHAR_DATA *ch, char *argument)
{
	OBJ_DATA *obj;
	OBJ_DATA *container;
	char arg[MIL];

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

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

        if ( ch->arcanoi[WINHB] < 4 )
        {
         stc("You do not have the power to use shellride.\n\r",ch);
         return;
        }

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

        if ( ( container = get_obj_room( ch, arg ) ) == NULL )
        {
         stc("I do not see that object anywhere.\n\r",ch);
         return;
        }

    if ( ( obj = ch->pcdata->chobj ) == NULL )
    {
        send_to_char("You are not an object.\n\r",ch);
        return;
    }

    if ( obj->chobj == NULL || obj->chobj != ch )
    {
        send_to_char("You are not an object.\n\r",ch);
        return;
    }


	if (ch->pcdata->chobj == NULL )
	{
	 stc("You must be an object to ride in a container!\n\r", ch);
	 return;
	}

            if (container->item_type != ITEM_CONTAINER &&
                container->item_type != ITEM_CORPSE_NPC &&
                container->item_type != ITEM_CORPSE_PC)
            {
                send_to_char("You cannot leap into that sort of object.\n\r",ch );
                return;
            }

            act("$p leap into $P.",ch,obj,container,TO_CHAR);
            act("$p leaps into $P.",ch,obj,container,TO_ROOM);
            obj_from_room(obj);
            obj_to_obj(obj,container);
            return;
}
void do_wraithpowers (CHAR_DATA * ch, char *argument)
{
   if (IS_NPC (ch))
      return;


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

   stc ("#e+-------------------------------------------------------------------------------#n\n\r", ch);
   cent_to_char ("#w+- Wraith Powers -+#n", ch);
   stc ("#e+-------------------------------------------------------------------------------#n\n\r", ch);
   stc ("       Argos: ", ch);
	   if (ch->arcanoi[WARGO] == 0)
	   {
		stc( "You know nothing of this.\n\r", ch );
		return;
	   }
   	   if (ch->arcanoi[WARGO] >= 1)
           {
		stc("Enshroud ", ch);
	   }
	   if (ch->arcanoi[WARGO] >= 2)
	   {
		stc("Shadow Wings ",ch);
	   }
           if (ch->arcanoi[WARGO] >= 3)
	   {
                stc("Flickering ",ch);
	   }
           if (ch->arcanoi[WARGO] >= 4)
	   {
		stc("Jump ",ch);
	   }
           if (ch->arcanoi[WARGO] >= 5)
	   {
		stc("Oubliette",ch);
	   }
   stc ("\n\r      Embody: ", ch);
	   if (ch->arcanoi[WBODY] == 0)
	   {
		stc("Upkeep in the material plane costs you 250 move and 300 hp.\n\r", ch );
		return;
	   }
	   if (ch->arcanoi[WBODY] == 1)
	   {
		stc("Upkeep in the material plane costs you 200 move and 200 hp.\n\r",ch);
		return;
	   }
	   if (ch->arcanoi[WBODY] == 2)
	   {
		stc("Upkeep in the material plane costs you 175 move and 150 hp.\n\r",ch);
		return;
	   }
           if (ch->arcanoi[WBODY] == 3)
	   {
		stc("Upkeep in the material plane costs you 150 move and 100 hp.\n\r",ch);
		return;
	   }
           if (ch->arcanoi[WBODY] == 4)
	   {
		stc("Upkeep in the material plane costs you 100 move and 50 hp.\n\r",ch);
		return;
	   }
           if (ch->arcanoi[WBODY] == 5)
	   {
		stc("Upkeep in the material plane costs you 50 move and 25 hp.\n\r",ch);
		return;
	   }
   stc ("\n\r    Fatalism: ", ch);
	   if (ch->arcanoi[WFATL] == 0)
	   {
		stc("Hitroll and Damroll bonus 0.\n\r", ch );
		return;
	   }
	   if (ch->arcanoi[WFATL] == 1)
	   {
		stc("Hitroll and Damroll bonus 50.\n\r", ch );
		return;
	   }
	   if (ch->arcanoi[WFATL] == 2)
	   {
		stc("Hitroll and Damroll bonus 100.\n\r", ch );
		return;
	   }
	   if (ch->arcanoi[WFATL] == 3)
	   {
		stc("Hitroll and Damroll bonus 250.\n\r", ch );
		return;
	   }
	   if (ch->arcanoi[WFATL] == 4)
	   {
		stc("Hitroll and Damroll bonus 500.\n\r", ch );
		return;
	   }
	   if (ch->arcanoi[WFATL] == 5)
	   {
		stc("Hitroll and Damroll bonus 600.\n\r", ch );
		return;
	   }

   stc ("#e\n\r+-------------------------------------------------------------------------------#n\n\r", ch);
   return;
}