area/
build/testing/
log/
player/
player/backup/
/***************************************************************************
 *  Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer,        *
 *  Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe.   *
 *                                                                         *
 *  Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael          *
 *  Chastain, Michael Quan, and Mitchell Tse.                              *
 *                                                                         *
 *  In order to use any part of this Merc Diku Mud, you must comply with   *
 *  both the original Diku license in 'license.doc' as well the Merc       *
 *  license in 'license.txt'.  In particular, you may not remove either of *
 *  these copyright notices.                                               *
 *                                                                         *
 *  Much time and thought has gone into this software and you are          *
 *  benefitting.  We hope that you share your changes too.  What goes      *
 *  around, comes around.                                                  *
 ***************************************************************************/
#include <glib.h>

#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <merc.h>
#include <interp.h>
#include <tables.h>
#include <power.h>
#include <fight.h>

extern bool    check_dumbshit  args( (char *command) );
extern void	set_fighting	args( ( CHAR_DATA *ch, CHAR_DATA *victim ) );
extern void    add_agony      args( ( CHAR_DATA *victim ) );
extern void 	add_snooper	args((DESCRIPTOR_DATA *ch, DESCRIPTOR_DATA *victim));
extern void 	remove_snooper	args((CHAR_DATA *ch, CHAR_DATA *target));

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

    argument = one_argument( argument, arg1 );


    if ( arg1[0] == '\0' )
    {
        send_to_char( "Transport which object?\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 ( ( obj = get_obj_carry( ch, arg1 ) ) == NULL )
    {
	    send_to_char( "You are not carrying that item.\n\r", ch );
	    return;
    }

    if (obj->weight > 100)
    {
		send_to_char( "That item weighs too much for the pigeon to carry.\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 ( victim->carry_number + 1 > can_carry_n( victim ) )
    {
		act( "$N has $S hands full.", ch, NULL, victim, TO_CHAR );
		return;
    }

    if ( victim->carry_weight + get_obj_weight( obj ) > can_carry_w( victim ) )
    {
		act( "$N can't carry that much weight.", ch, NULL, victim, TO_CHAR );
   		return;
    }

    if ( !can_see_obj( victim, obj ) )
    {
		act( "$N can't see it.", ch, NULL, victim, TO_CHAR );
		return;
    }
	
    send_to_char( "A pigeon flies down from the sky and lands on your shoulder.\n\r", ch );
    act("A pigeon flies down from the sky and lands on $n's shoulder.",ch,NULL,NULL,TO_ROOM);
    act("You place $p in the pigeon's beak.",ch,obj,NULL,TO_CHAR);
    act("$n places $p in the pigeon's beak.",ch,obj,NULL,TO_ROOM);
    send_to_char( "The pigeon takes off from your shoulder and flies away.\n\r", ch );
    act("The pigeon takes off from $n's shoulder and flies away.",ch,NULL,NULL,TO_ROOM);

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

    send_to_char( "A pigeon flies down from the sky and lands on your shoulder.\n\r", victim );
    act("A pigeon flies down from the sky and lands on $n's shoulder.",victim,NULL,NULL,TO_ROOM);
    act("You take $p from the pigeon's beak.",victim,obj,NULL,TO_CHAR);
    act("$n takes $p from the pigeon's beak.",victim,obj,NULL,TO_ROOM);
    send_to_char( "The pigeon takes off from your shoulder and flies away.\n\r", victim );
    act("The pigeon takes off from $n's shoulder and flies away.",victim,NULL,NULL,TO_ROOM);

    do_autosave(ch,"");
    do_autosave(victim,"");
    return;
}

void power_unveil( CHAR_DATA *ch, CHAR_DATA *victim, char *argument )
{
	if (IS_NPC(victim))
	{
		send_to_char( "Not on NPC's.\n\r", ch );
		return;
	}

	if ( victim == ch )
	{
		remove_snooper(ch,ch);
		return;
	}

	if (!IS_NPC(victim) && IS_IMMUNE(victim,IMM_SHIELDED) && !IS_ITEMAFF(ch, ITEMA_VISION))
	{
		send_to_char("You are unable to read their aura.\n\r",ch);
		return;
	}

	if (!IS_NPC(victim) && IS_SET(victim->sphere_spaffect,AFSPHERE_SHIELD) && !IS_ITEMAFF(ch, ITEMA_VISION))
	{
		send_to_char("You are unable to read their aura.\n\r",ch);
		return;
	}

	if (victim->pcdata->willpower > number_range(10,20))
	{
		send_to_char("You failed.\n\r",ch);
		return;
	}

	add_snooper(ch->desc, victim->desc);
	return;
}

void power_anima( CHAR_DATA *ch,CHAR_DATA *victim, char *argument )
{
	
	if ( victim == ch
		||   victim->in_room == NULL
		||   IS_NPC(ch)
 //   ||   IS_NPC(victim) -dc
		||   victim->level > 50
		||   (!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 == 1
		||   victim->in_room->vnum == 2
		||   victim->in_room->vnum == 1200
		||   (ch->pk_timer > 0 && is_tempsafe(ch)) 
		||   ( strstr(victim->in_room->area->builders, "Unlinked" ) )
		||   victim->in_room->vnum == ch->in_room->vnum)
	{
		send_to_char( "You failed.\n\r", ch );
		return;
	}
	
	send_to_char("You start walking.\n\r",ch);
	char_from_room( ch );
	char_to_room( ch, victim->in_room );
	
	do_look( ch,"auto");
	act( "$n appears in front of $N.", ch, NULL, victim, TO_ROOM );
	act( "$N appears in front of you.", ch, NULL, victim, TO_VICT );
	return;
}

void power_mirrorimage( CHAR_DATA *ch,CHAR_DATA *victim, char *argument )
{
    OBJ_DATA *obj;
    OBJ_DATA *obj2;

    if (ch->pcdata->followers > 4)
    {
		send_to_char("Nothing happens.\n\r",ch);
		return;
    }
	
    ch->pcdata->followers++;
    victim=create_mobile( get_mob_index( MOB_VNUM_CLONE ) );
    char_to_room(victim,get_room_index(ROOM_VNUM_DISCONNECTION));
    victim->lord = g_string_assign(victim->lord,ch->name->str);
    victim->name = g_string_assign(victim->name,ch->name->str);
    victim->short_descr = g_string_assign(victim->short_descr,ch->name->str);
    victim->long_descr = g_string_assign(victim->long_descr,"");
    if (IS_CLASS(ch,CLASS_TESTVAMP)) 
    	victim->creature = CLASS_TESTVAMP;
   
    victim->alignment = ch->alignment;
   
    if (ch->description->len > 1)
    {
	victim->description = g_string_assign(victim->description,ch->description->str);
	}
    SET_BIT(victim->act, ACT_NOPARTS);
	SET_BIT(victim->added, ADDED_ILLUSION);
    {
	OBJ_DATA *obj_next;
	for ( obj = ch->carrying; obj != NULL; obj = obj_next )
	{
	    obj_next = obj->next_content;
	    if ( obj->wear_loc != WEAR_NONE )
	    {
			if (( obj2 = create_object( obj->pIndexData, 0 )) != NULL )
			{
		    	obj_to_char(obj2, victim);
		    	wear_obj( victim, obj2, obj->wear_loc );
			}
	    }
	}
    }
    victim->level = 50;
    victim->hit = ch->hit;
    victim->max_hit = ch->max_hit;
    victim->mana = ch->mana;
    victim->max_mana = ch->max_mana;
    victim->move = ch->move;
    victim->max_move = ch->max_move;
    victim->hitroll = char_hitroll(ch);
    victim->damroll = char_damroll(ch);
    victim->armor = char_ac(ch);
    char_from_room(victim);
    char_to_room(victim,ch->in_room);

    send_to_char("A mirror image of you shimmers into existance.\n\r",ch);
    act("A mirror image of $n appears in the room.",ch,NULL,NULL,TO_ROOM);
    return;
}

void power_rename( CHAR_DATA *ch, CHAR_DATA *victim, char *argument )
{
    OBJ_DATA *obj;
    char      arg1[MAX_INPUT_LENGTH];
    char      arg2[MAX_INPUT_LENGTH];
    char      buf [MAX_STRING_LENGTH];
    char      endchar[15];

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

    if ( arg1[0] == '\0' || arg2[0] == '\0' || argument[0] == '\0' )
    {
    	send_to_char( "Syntax: False <object> rename  <short description>\n\r", ch );
	    send_to_char( "Syntax: False <object> keyword <extra keyword/s>\n\r", ch );
	    return;
    }
	
	if ( ( obj = get_obj_carry( ch, arg1 ) ) == NULL )
    {
	send_to_char( "You are not carrying that object.\n\r", ch );
	return;
    }

    if ( !str_cmp( arg2, "rename" ) )
    {
	if (IS_SET(obj->quest, QUEST_RELIC))
	{
	    send_to_char("Not on a relic.\n\r",ch);
	    return;
	}
	if (IS_CLASS(ch, CLASS_VAMPIRE)) 
		ch->pcdata->condition[COND_THIRST] -= 20;
	if (strlen(argument) < 5)
	{
	    send_to_char("Name should be at least 5 characters long.\n\r",ch);
	    return;
	}
	strcpy(argument,capitalize(argument));
	argument[0] = LOWER(argument[0]);
	endchar[0] = (argument[strlen(argument)-1]);
	endchar[1] = '\0';
	if (!str_cmp(endchar,".")) argument[strlen(argument)-1] = '\0';
	obj->name = g_string_assign(obj->name,argument);
	obj->short_descr = g_string_assign(obj->short_descr,argument);
	if (is_in(argument,"|pair of*"))
	    sprintf(buf, "%s are lying here.",argument);
	else
	    sprintf(buf, "%s is lying here.",argument);
	buf[0] = UPPER(buf[0]);
	obj->description = g_string_assign(obj->description,buf);
	send_to_char("Ok.\n\r",ch);
    obj->questmaker = g_string_assign(obj->questmaker,ch->name->str);
    return;
    }

    if ( !str_cmp( arg2, "keyword" ) || !str_cmp( arg2, "keywords" ) )
    {
	if (IS_SET(obj->quest, QUEST_RELIC))
	{
	    send_to_char("Not on a relic.\n\r",ch);
	    return;
	}
	if (strlen(argument) < 3)
	{
	    send_to_char("Keywords should be at least 3 characters long.\n\r",ch);
	    return;
	}
	strcpy(argument,capitalize(argument));
	argument[0] = LOWER(argument[0]);
	endchar[0] = (argument[strlen(argument)-1]);
	endchar[1] = '\0';
	if (!str_cmp(endchar,".")) argument[strlen(argument)-1] = '\0';
	strcpy(buf,obj->name->str);
	if (strlen(buf) > 80)
	{
	    send_to_char("You cannot fit any more keywords on this object.\n\r",ch);
	    return;
	}
	strcat(buf," ");
	strcat(buf,argument);
	obj->name = g_string_assign(obj->name,buf);
	send_to_char("Ok.\n\r",ch);
    obj->questmaker = g_string_assign(obj->questmaker,ch->name->str);
    return;
    }
    send_to_char( "Syntax: False <object> rename  <short description>\n\r", ch );
    send_to_char( "Syntax: False <object> keyword <extra keyword/s>\n\r", ch );
    return;
}

void power_control( CHAR_DATA *ch, CHAR_DATA *victim, char *argument )
{
    CHAR_DATA *familiar;
        if ( ( familiar = ch->pcdata->familiar ) != NULL ) 
    {
		send_to_char( "Nothing happens.\n\r", ch );
		return;
    }

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

    if ( ( familiar = victim->wizard ) != NULL ) 
    {
		send_to_char( "Nothing happens.\n\r", ch );
		return;
    }

    if (!IS_ADDED(victim, ADDED_ILLUSION))
    {
		send_to_char( "Nothing happens.\n\r", ch );
		return;
    }
	
    act("You use your power over illusions to control $N.",ch,NULL,victim,TO_CHAR);
    ch->pcdata->familiar = victim;
    victim->wizard = ch;
    return;
}

void power_portal( CHAR_DATA *ch, CHAR_DATA *victim, char *argument )
{
    OBJ_DATA  *obj;
    int        duration;

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

    duration = number_range(2,3) * 15;

    obj = create_object( get_obj_index( OBJ_VNUM_PORTAL ), 0 );
    obj->value[0] = victim->in_room->vnum;
    obj->value[3] = ch->in_room->vnum;
    obj->timer = duration;
    obj->short_descr = g_string_assign(obj->short_descr,"an infernal portal");
    obj->description = g_string_assign(obj->description,"An infernal portal of burning flames floats here.");
    obj_to_room( obj, ch->in_room );

    obj = create_object( get_obj_index( OBJ_VNUM_PORTAL ), 0 );
    obj->value[0] = ch->in_room->vnum;
    obj->value[3] = victim->in_room->vnum;
    obj->timer = duration;
    obj->short_descr = g_string_assign(obj->short_descr,"an infernal portal");
    obj->description = g_string_assign(obj->description,"An infernal portal of burning flames floats here.");
    obj_to_room( obj, victim->in_room );

    act( "$p bursts from the ground in front of $n.", ch, obj, NULL, TO_ROOM );
    act( "$p bursts from the ground appears in front of you.", ch, obj, NULL, TO_CHAR );
    act( "$p bursts from the ground appears in front of $n.", victim, obj, NULL, TO_ROOM );
    act( "$p bursts from the ground appears in front of you.", ch, obj, victim, TO_VICT );
    return;
}

void power_soultwist( CHAR_DATA *ch, CHAR_DATA *victim, char *argument )
{
    int       damage;

	if (!IS_EVIL(ch))
    {
		send_to_char( "You are not evil enough to use Soul Twist.\n\r", ch );
		return;
    }

    if (victim->alignment < 1)
    {
		send_to_char( "They are not good enough to use Soul Twist on.\n\r", ch );
		return;
    }
	
    damage = victim->alignment;

    act( "A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM );

    send_to_char("You scream in agony as your very soul seems to be torn apart!\n\r",victim);
    act("$n clutches $s chest and screams in agony!",victim,NULL,NULL,TO_ROOM);

    victim->hit -= damage;
    update_pos(victim);
    return;
}

void power_curse( CHAR_DATA *ch,CHAR_DATA *victim, char *argument )
{
    OBJ_DATA  *obj;
    int       critical = number_range(1,4);

    act( "A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM );

    if (number_percent() > (ch->pcdata->stats[UNI_GEN] * get_disc(ch,DISC_DAIMOINON)))
    {
        send_to_char("Nothing happens.\n\r",ch);
        return;
    }

    if (critical == 1)
    {
        if (IS_ARM_L(victim,LOST_ARM))
        {
            send_to_char( "Nothing happens.\n\r", ch );
            return;
        }

        SET_BIT(victim->loc_hp[2],LOST_ARM);

        if (IS_BLEEDING(victim,BLEEDING_HAND_L))
            REMOVE_BIT(victim->loc_hp[6],BLEEDING_HAND_L);
        send_to_char("Your scream in agony as your left arm falls off!\n\r",victim);
        act("$n screams in agony as $s left arm falls off!",victim,NULL,NULL,TO_ROOM);
        make_part(victim,"arm");
        if (IS_ARM_L(victim,LOST_ARM) && IS_ARM_R(victim,LOST_ARM))
        {
            if ((obj = get_eq_char( victim, WEAR_ARMS )) != NULL)
                take_item(victim,obj);
        }
        if ((obj = get_eq_char( victim, WEAR_HOLD )) != NULL)
            take_item(victim,obj);
        if ((obj = get_eq_char( victim, WEAR_HANDS )) != NULL)
            take_item(victim,obj);
        if ((obj = get_eq_char( victim, WEAR_WRIST_L )) != NULL)
            take_item(victim,obj);
        if ((obj = get_eq_char( victim, WEAR_FINGER_L )) != NULL)
            take_item(victim,obj);
        return;
    } 
    else if (critical == 2)
    {
        if (IS_ARM_R(victim,LOST_ARM))
        {
            send_to_char( "Nothing happens.\n\r", ch );
            return;
        }
        SET_BIT(victim->loc_hp[3],LOST_ARM);
        if (IS_BLEEDING(victim,BLEEDING_HAND_R))
            REMOVE_BIT(victim->loc_hp[6],BLEEDING_HAND_R);
        send_to_char("Your scream in agony as your right arm falls off!\n\r",victim);
        act("$n screams in agony as $s right arm falls off!",victim,NULL,NULL,TO_ROOM);
        make_part(victim,"arm");
        if (IS_ARM_L(victim,LOST_ARM) && IS_ARM_R(victim,LOST_ARM))
        {
            if ((obj = get_eq_char( victim, WEAR_ARMS )) != NULL)
                take_item(victim,obj);
        }
        if ((obj = get_eq_char( victim, WEAR_WIELD )) != NULL)
            take_item(victim,obj);
        if ((obj = get_eq_char( victim, WEAR_HANDS )) != NULL)
            take_item(victim,obj);
        if ((obj = get_eq_char( victim, WEAR_WRIST_R )) != NULL)
            take_item(victim,obj);
        if ((obj = get_eq_char( victim, WEAR_FINGER_R )) != NULL)
            take_item(victim,obj);
        return;
    } 
    else if (critical == 3)
    {
        if (IS_LEG_L(victim,LOST_LEG))
        {
            send_to_char( "Nothing happens.\n\r", ch );
            return;
        }
        SET_BIT(victim->loc_hp[4],LOST_LEG);
        if (IS_BLEEDING(victim,BLEEDING_FOOT_L))
            REMOVE_BIT(victim->loc_hp[6],BLEEDING_FOOT_L);
        send_to_char("Your scream in agony as your left leg falls off!\n\r",victim);
        act("$n screams in agony as $s left leg falls off!",victim,NULL,NULL,TO_ROOM);
        make_part(victim,"leg");
        if (IS_LEG_L(victim,LOST_LEG) && IS_LEG_R(victim,LOST_LEG))
        {
            if ((obj = get_eq_char( victim, WEAR_LEGS )) != NULL)
                take_item(victim,obj);
        }
        if ((obj = get_eq_char( victim, WEAR_FEET )) != NULL)
            take_item(victim,obj);
        return;
    } 
    else if (critical == 4)
    {
        if (IS_LEG_R(victim,LOST_LEG))
        {
            send_to_char( "Nothing happens.\n\r", ch );
            return;
        }
        SET_BIT(victim->loc_hp[5],LOST_LEG);
        if (IS_BLEEDING(victim,BLEEDING_FOOT_R))
            REMOVE_BIT(victim->loc_hp[6],BLEEDING_FOOT_R);
        send_to_char("Your scream in agony as your right leg falls off!\n\r",victim);
        act("$n screams in agony as $s right leg falls off!",victim,NULL,NULL,TO_ROOM);
        make_part(victim,"leg");
        if (IS_LEG_L(victim,LOST_LEG) && IS_LEG_R(victim,LOST_LEG))
        {
            if ((obj = get_eq_char( victim, WEAR_LEGS )) != NULL)
                take_item(victim,obj);
        }
        if ((obj = get_eq_char( victim, WEAR_FEET )) != NULL)
            take_item(victim,obj);
        return;
    }
    send_to_char("Nothing happens.\n\r",ch);
    return;
}

void power_murmur( CHAR_DATA *ch, CHAR_DATA *victim, char *argument )
{
	char arg2[MAX_INPUT_LENGTH];
	
	smash_quote(argument);
	argument = one_argument( argument, arg2);
	
	if (IS_NPC(victim))
	{
		send_to_char("You can only do this on players.\n\r",ch);
		return;
	}
	
	if ( arg2[0] == '\0' )
	{
		send_to_char( "What do you wish to murmur?\n\r", ch );
		return;
	}


	if ( !check_dumbshit(arg2))
	{
		send_to_char("You can't force them to do that!\n\r",ch);
		return;
	}
	
	/*do the dumb shit :P */
	smash_tilde( arg2 );
	victim->murmur_name = g_string_assign(victim->murmur_name,ch->name->str);
	victim->murmur_command = g_string_assign(victim->murmur_command,arg2);
	act("You murmur something to $N",ch,NULL,victim,TO_CHAR);
	send_to_char("Someone says something you didn't catch.\n\r",victim);
	return;
}

void power_loyalty( CHAR_DATA *ch, CHAR_DATA *victim, char *argument )
{
    if ( IS_NPC(victim) )
    {
		send_to_char( "Not on NPC's\n\r", ch );
		return;
    }

	if (!IS_NPC(victim) && 	victim->pcdata->willpower >= number_range(1,20))
    {
		act("You shake off $N's attempt to make you loyal.",victim,NULL,ch,TO_CHAR);
		act("$n shakes off $N's attempt to make $m loyal.",victim,NULL,ch,TO_NOTVICT);
		act("$n shakes off your attempt to make $m loyal.",victim,NULL,ch,TO_VICT);
		return;
    }

	if (strlen(victim->pcdata->conding) < 2 || 
	str_cmp(victim->pcdata->conding,ch->name->str))
    {
		send_to_char( "They are not conditioned to you.\n\r", ch );
		return;
    }

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

    if (IS_ADDED(victim,ADDED_LOYAL) )
    {
	act("You remove $N's loyalty to you.", ch, NULL, victim, TO_CHAR);
	act("You no longer feel quite so loyal to $n.", ch, NULL, victim, TO_VICT);
	REMOVE_BIT(victim->added, ADDED_LOYAL);
	return;
    }
    act("You make $N completely loyal to you.", ch, NULL, victim, TO_CHAR);
    act("You suddenly feel completely loyal to $n.", ch, NULL, victim, TO_VICT);
    SET_BIT(victim->added, ADDED_LOYAL);
    return;
}

void power_reina( CHAR_DATA *ch, CHAR_DATA *victim, char *argument )
{
    CHAR_DATA *rch;
	AFFECT_DATA paf;
	
    if (ch->in_room == NULL)
    {
	send_to_char("Nothing happens.\n\r",ch);
	return;
    }

	if ( ch->in_room->sector_type == SECT_INSIDE )
    {
		send_to_char("You can only use this power outside.\n\r",ch);
		return;
    }

	if (ch->in_room->vnum == 3001)
	{
		send_to_char("Degrade the sacred Temple of Midgaard??.\n\r",ch);
		return;
	}
	
	if ( ch->silent_time != 0 )
	{
		send_to_char("You can't reina this room at this time.\n\r",ch);
		return;
	}
	
	
	if ( IS_RAFFECTED(ch->in_room, ROOM_AFF_REINA ))
	{
		send_to_char("You cann't reina this room anymore.\n\r",ch);
		return;
	}
	
   
	send_to_char("You sing the Song of Reina.\n\r", ch);
    act("$n sings a beautiful, haunting song.", ch, NULL, NULL, TO_ROOM );
    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);
    
	paf.duration  = 5;
	paf.bitvector = ROOM_AFF_REINA;
	affect_to_room( ch->in_room, &paf );
	
	ch->silent_time = 10;
	
	for ( rch = ch->in_room->people; rch != NULL; rch = rch->next_in_room )
    {
	if ( rch->fighting != NULL )
	    stop_fighting( rch, TRUE );
    }
    return;
}

void power_courage( CHAR_DATA *ch, CHAR_DATA *victim, char *argument )
{
    if (IS_NPC(victim))
    {
		send_to_char( "Not on NPC's.\n\r", ch );
		return;
    }
	
    send_to_char("You sing the Song of Courage.\n\r", ch);
    act("$n sings a beautiful, haunting song.", ch, NULL, NULL, TO_ROOM );
    
	if (IS_ADDED(victim, ADDED_COURAGE))
    {
		if (!IS_NPC(victim) && victim->pcdata->willpower >= number_range(10,30) && ch != victim)
		{
	   		send_to_char("They resist you.\n\r",ch);
	    	return;
		}
		if (ch != victim) 
			send_to_char("You remove their Courage.\n\r",ch);
	
			send_to_char("You no longer feel quite so brave.\n\r",victim);
	
			return;
    }

    if (ch != victim) 
		send_to_char("You grant them great Courage.\n\r",ch);
    
	send_to_char("You suddenly feel very brave.\n\r",victim);

    SET_BIT(ch->added, ADDED_COURAGE);
    return;
}

void power_love( CHAR_DATA *ch, CHAR_DATA *victim, char *argument )
{
    if ( IS_NPC(victim) )
    {
		send_to_char( "Not on NPC's\n\r", ch );
		return;
    }

    send_to_char("You sing the Song of Love.\n\r", ch);
    act("$n sings a beautiful, haunting song.", ch, NULL, NULL, TO_ROOM );

    if (strlen(victim->pcdata->conding) > 2)
    {
	if (!str_cmp(victim->pcdata->conding,ch->name->str))
	{
	    act("You remove $N's love for you!", ch, NULL, victim, TO_CHAR);
	    act("You are no longer in love with $n!", ch, NULL, victim, TO_VICT);
	    victim->pcdata->conding = g_strdup( "" );
	}
	else
	{
	    send_to_char( "They are already in love with someone else.\n\r", ch );
	}
	return;
    }

    if (!IS_NPC(victim) && IS_CLASS(victim,CLASS_TESTVAMP) && 	get_disc(victim,DISC_PRESENCE) >= get_disc(ch,DISC_PRESENCE) )
    {
		send_to_char("They resist you.\n\r",ch);
		return;
    }

    if (!IS_NPC(victim) && victim->pcdata->willpower >= number_range(10,30))
    {
		send_to_char("They resist you.\n\r",ch);
		return;
    }
    if (IS_ADDED(victim,ADDED_LOYAL) )
    {
		act("You remove $N's love to you.", ch, NULL, victim, TO_CHAR);
		act("You no longer feel quite so loving to $n.", ch, NULL, victim, TO_VICT);
		REMOVE_BIT(victim->added, ADDED_LOYAL);
		return;
    }
    act("You make $N fall in love with you!", ch, NULL, victim, TO_CHAR);
    act("You fall in love with $n!", ch, NULL, victim, TO_VICT);
    act("$N gazes lovingly into $n's eyes!", ch, NULL, victim, TO_NOTVICT);
	SET_BIT(victim->added, ADDED_LOYAL);
    return;
}

void power_anger( CHAR_DATA *ch, CHAR_DATA *victim, char *argument )
{
    if (IS_NPC(victim))
    {
		send_to_char( "Not on NPC's.\n\r", ch );
		return;
    }

    send_to_char("You sing the Song of Anger.\n\r", ch);
    act("$n sings a beautiful, haunting song.", ch, NULL, NULL, TO_ROOM );
    
	if (IS_ADDED(victim, ADDED_ANGER))
    {
		send_to_char("You no longer feel so angry.\n\r",victim);
		act("$n regains $s temper.",victim,NULL,NULL,TO_ROOM);
		REMOVE_BIT(victim->added, ADDED_ANGER);
		return;
    }

    if (!IS_NPC(victim) && ch != victim)
    {
		send_to_char("They resist you.\n\r",ch);
		return;
    }

    if (!IS_NPC(victim) && victim->pcdata->willpower >= number_range(10,30) && ch != victim)
    {
		send_to_char("They resist you.\n\r",ch);
		return;
    }

    if (IS_ADDED(victim, ADDED_CALM))
    {
		send_to_char("You no longer feel so calm.\n\r",victim);
		act("$n no longer seems quite so calm.",victim,NULL,NULL,TO_ROOM);
		REMOVE_BIT(victim->added, ADDED_CALM);
		WAIT_STATE( ch, 12 );
		return;
    }
    
	send_to_char("You suddenly feel very angry!\n\r",victim);
    act("$n snarls with anger.",victim,NULL,NULL,TO_ROOM);
    SET_BIT(victim->added, ADDED_ANGER);
    return;
}

void power_thanatopsis( CHAR_DATA *ch,CHAR_DATA *victim, char *argument )
{
    OBJ_DATA *obj;
    ROOM_INDEX_DATA *pRoomIndex;
    ROOM_INDEX_DATA *location;
    char arg[MAX_INPUT_LENGTH];
    char buf[MAX_INPUT_LENGTH];

    one_argument( argument, arg );

    if ( ( obj = get_obj_here( ch, arg ) ) == NULL )
    {
		send_to_char( "You cannot seem to find that object.\n\r", ch );
		return;
    }

    if (obj->item_type != ITEM_CORPSE_NPC && obj->item_type != ITEM_CORPSE_PC)
    {
		send_to_char( "That isn't a corpse.\n\r", ch );
		return;
    }

    act("You examine $p carefully.",ch,obj,NULL,TO_CHAR);
    act("$n examines $p carefully.",ch,obj,NULL,TO_ROOM);

    if (obj->questmaker->len < 1 || obj->questowner->len < 1)
    {
		send_to_char( "You are unable to discover anything about the killer.\n\r", ch );
		return;
    }

    sprintf(buf,"It seems that %s was killed by %s.\n\r",obj->questowner->str,obj->questmaker->str);
    send_to_char(buf,ch);

    if ( ( location = ch->in_room ) == NULL )
    {
	send_to_char("Bug - Please note Spiral or Dominion.\n\r",ch);
	return;
    }
    if ( ( pRoomIndex = get_room_index(obj->specpower) ) == NULL )
    {
	sprintf(buf,"You are unsure where %s was killed.\n\r",obj->questowner->str);
	send_to_char(buf,ch);
    }
    else
    {
		if (location == pRoomIndex)
	    	sprintf(buf,"It seems that %s was killed right here.\n\r", obj->questowner->str);
		else
		{
	    	char_from_room(ch);
	    	char_to_room(ch,pRoomIndex);
	    	sprintf(buf,"It seems that %s was killed at %s.\n\r", obj->questowner->str, ch->in_room->name);
	    	char_from_room(ch);
	    	char_to_room(ch,location);
		}
		send_to_char(buf,ch);
    }

    return;
}

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

    one_argument( argument, arg );

    if ( ( obj = get_obj_here( ch, arg ) ) == NULL )
    {
		send_to_char( "You cannot seem to find that object.\n\r", ch );
		return;
    }

    if ( obj->chobj != NULL )
    {
		send_to_char( "You are unable to preserve it.\n\r", ch );
		return;
    }

    if (obj->item_type == ITEM_CORPSE_PC)
	send_to_char( "You cannot preserve that type of corpse.\n\r", ch );
    else if (obj->item_type == ITEM_FOOD)
    {
		act("$p shrivels up.",ch,obj,NULL,TO_CHAR);
		act("$p shrivels up.",ch,obj,NULL,TO_ROOM);
		if (obj->value[0] > 1) obj->value[0] = (int)((double)obj->value[0]  * 0.5);
		ch->carry_weight -= obj->weight;
		if (obj->weight > 1) obj->weight = (int)((double)obj->weight * 0.5);
		ch->carry_weight += obj->weight;
		obj->timer = -1;
    }
    else if (obj->item_type == ITEM_CORPSE_NPC)
    {
		if (obj->questowner->len < 1)
		{
	   		act("You are unable to preserve $p.",ch,obj,NULL,TO_CHAR);
	   		return;
		}
	
		if (obj->timer < 1)
		{
	   		send_to_char( "It is already preserved.\n\r", ch );
	   		return;
		}
		act("$p shrivels up.",ch,obj,NULL,TO_CHAR);
		act("$p shrivels up.",ch,obj,NULL,TO_ROOM);
	
		sprintf(buf, "the shriveled up corpse of %s",obj->questowner->str);
		obj->short_descr = g_string_assign(obj->short_descr,buf);
		sprintf(buf, "The shriveled up corpse of %s is lying here.",obj->questowner->str);
		obj->description = g_string_assign(obj->description,buf);
		
		ch->carry_weight -= obj->weight;
		if (obj->weight > 1) 
			obj->weight =(int)((double)obj->weight * 0.5);
		ch->carry_weight += obj->weight;
		obj->timer = -1;
    }
    else
		send_to_char( "You cannot preserve that object.\n\r", ch );
    return;
}

void power_mortal( CHAR_DATA *ch, CHAR_DATA *vcitim, char *argument )
{
	if (!IS_SET(ch->pcdata->stats[UNI_AFF], VAM_MORTAL))
    {
    	
	    /* Remove physical vampire attributes when you take mortal form */
		if (IS_VAMPAFF(ch,VAM_DISGUISED) ) power_mask(ch,ch,"self");
		if (IS_IMMUNE(ch,IMM_SHIELDED) ) power_shield(ch,ch,"");
		if (IS_VAMPAFF(ch,VAM_FANGS) ) power_fangs(ch,ch,"");
		if (IS_VAMPAFF(ch,VAM_CLAWS) ) power_claws(ch,ch,"");
		if (IS_VAMPAFF(ch,VAM_NIGHTSIGHT) ) power_nightsight(ch,ch,"");
		if (IS_SET(ch->act,PLR_HOLYLIGHT) ) power_truesight(ch,ch,"");
		if (IS_VAMPAFF(ch,VAM_CHANGED) ) power_change(ch,ch,"human");
		if (IS_POLYAFF(ch,POLY_SERPENT) ) power_serpent(ch,ch,"");
		ch->pcdata->stats[UNI_RAGE] = 0;
		ch->pcdata->condition[COND_THIRST] = 100;
		
		send_to_char("Colour returns to your skin and you warm up a little.\n\r",ch);
		act("Colour returns to $n's skin.", ch, NULL, NULL, TO_ROOM);
		
		REMOVE_BIT(ch->creature, CLASS_VAMPIRE);
		SET_BIT(ch->pcdata->stats[UNI_AFF], VAM_MORTAL);
	}
    else
    {
        send_to_char("You skin pales and cools.\n\r",ch);
        act("$n's skin pales slightly.", ch, NULL, NULL, TO_ROOM);
        ch->creature=CLASS_VAMPIRE;
        REMOVE_BIT(ch->pcdata->stats[UNI_AFF], VAM_MORTAL);
    }
	return;
}

void power_nocturn( CHAR_DATA *ch,CHAR_DATA *victim, char *argument )
{
	AFFECT_DATA paf;
	
	if (ch->in_room->vnum == 3001)
	{
		send_to_char("Degrade the sacred Temple of Midgaard??.\n\r",ch);
		return;
	}
	
	if ( ch->silent_time != 0 )
	{
		send_to_char("You can't darken this room at this time.\n\r",ch);
		return;
	}
	
	if ( IS_RAFFECTED(ch->in_room, ROOM_AFF_DARK ))
	{
		send_to_char("You cann't darken this room anymore.\n\r",ch);
		return;
	}
	
	paf.duration  = 5;
	paf.bitvector = ROOM_AFF_DARK;
	affect_to_room( ch->in_room, &paf );
	
	act( "All light fades into a complete darkness.", ch, NULL, NULL, TO_ROOM );
	act( "All light fades into a complete darkness.", ch, NULL, NULL, TO_CHAR );
	ch->silent_time = 10;
	return;
}

void power_ahriman( CHAR_DATA *ch, CHAR_DATA *victim, char *argument )
{
	int sn;
	int level;
	int spelltype;
	
	if (ch->fighting == NULL)
		set_fighting(ch,victim);
	
    if ( ( sn = skill_lookup( "arms" ) ) < 0 ) return;
	spelltype = skill_table[sn].target;
	level = (int)((double)ch->spl[spelltype] * 0.25);
	(*skill_table[sn].spell_fun) ( sn, level, ch, victim );
	return;
}

void power_abyss( CHAR_DATA *ch, CHAR_DATA *victim, char *argument )
{
	if (victim->plane != PLANE_SHADOW)
	{
		send_to_char("They are not in the shadow plane!.\n\r",ch);
		return;
	}

	ch->plane = PLANE_NORMAL;
	shift_obj_plane(ch);
	send_to_char("You fade back into the real world.\n\r",victim);
	act("The shadows flicker and $n fades into existance.",victim,NULL,NULL,TO_ROOM);

	//check_killer( ch, victim );
	set_fighting( ch, victim );
	set_attack_flag(ch,victim);
	multi_hit( ch, victim, TYPE_UNDEFINED );
	return;
}

void power_nightfall( CHAR_DATA *ch,CHAR_DATA *victim, char * argument )
{
	SPHERE_DATA af;
	SPHERE_DATA *sp_paf;
	
	if (IS_SET(ch->added,ADDED_NIGHTFALL) )
	{
		if ((sp_paf = find_spaffect(ch,ADDED_NIGHTFALL)) != NULL)
		{
			sphere_remove( ch, sp_paf );
			return;	
		}
	}
        if ( weather_info[ch->in_room->sector_type].sunlight == SUN_DARK )
        {
                send_to_char("The night has already fallen.\n\r",ch);
                return;
        }

	
	af.spell_number = mage_affect_slot("Nightfall");
	af.type      = TYPE_SPHERE_ADDED;
	af.duration  = get_disc(ch,DISC_OBTENEBRATION);
	af.bitvector = ADDED_NIGHTFALL;
	sphere_to_char( ch, &af );
	send_to_char( mage_affect_table[mage_affect_slot("Nightfall")].on_msg, ch );
	act( "$n grins as nightfall surrounds his body.", ch, NULL, NULL, TO_ROOM );
	act( "You feel the nightfall surround your body.", ch, NULL, NULL, TO_CHAR );
	return;
	
}

void power_tenebrous( CHAR_DATA *ch, CHAR_DATA *victim, char *argument )
{
	char buf[MAX_STRING_LENGTH];
	
	if (IS_POLYAFF(ch, POLY_ZULO))
    {
	send_to_char( "Not while in Zulo Form.\n\r", ch );
	return;
    }

	if (IS_POLYAFF(ch, POLY_CHANGELING))
    {
	send_to_char( "Not while in changeling Form.\n\r", ch );
	return;
    }
	if (IS_POLYAFF(ch, POLY_BONECRAFT))
    {
	send_to_char( "Not while in bonecraft Form.\n\r", ch );
	return;
    }

	// Add MistyForm
	if (!IS_AFFECTED(ch,AFF_POLYMORPH))
	{
		if (ch->stance[0] != -1) do_stance(ch,"");
		if (ch->mounted == IS_RIDING) do_dismount(ch,"");
		act( "You transform into shadow form.", ch, NULL, NULL, TO_CHAR );
		act( "$n transforms into a shadow.", ch, NULL, NULL, TO_ROOM );
		if (IS_EXTRA(ch, TIED_UP))
		{
			act("The ropes binding you fall through your ethereal form.",ch,NULL,NULL,TO_CHAR);
			act("The ropes binding $n fall through $s ethereal form.",ch,NULL,NULL,TO_ROOM);
			REMOVE_BIT(ch->extra, TIED_UP);
			REMOVE_BIT(ch->extra, GAGGED);
			REMOVE_BIT(ch->extra, BLINDFOLDED);
		}
		if (is_affected(ch, gsn_web))
		{
			act("The webbing entrapping $n falls through $s ethereal form.",ch,NULL,NULL,TO_ROOM);
			send_to_char("The webbing entrapping you falls through your ethereal form.\n\r",ch);
			affect_strip(ch, gsn_web);
		}
		SET_BIT(ch->pcdata->powers[WOLF_POLYAFF], POLY_MIST);
		SET_BIT(ch->pcdata->stats[UNI_AFF], VAM_CHANGED);
		SET_BIT(ch->affected_by, AFF_POLYMORPH);
		ch->plane = PLANE_ETHEREAL;
		shift_obj_plane(ch);
		sprintf(buf, "%s the shadow", ch->name->str);
		ch->morph = g_string_assign(ch->morph,buf);
		strip_player(ch);
	}
	else
	{
		REMOVE_BIT(ch->pcdata->powers[WOLF_POLYAFF], POLY_MIST);
		act( "You transform into human form.", ch, NULL, NULL, TO_CHAR );
		act( "$n transforms into human form.", ch, NULL, NULL, TO_ROOM );
		REMOVE_BIT(ch->affected_by, AFF_POLYMORPH);
		REMOVE_BIT(ch->pcdata->stats[UNI_AFF], VAM_CHANGED);
		ch->plane = PLANE_NORMAL;
		shift_obj_plane(ch);
		clear_stats(ch);
		ch->morph = g_string_assign(ch->morph,"");
	}
	return;
}

void power_entrancement( CHAR_DATA *ch, CHAR_DATA *victim, char *argument )
{
    int sn;
    int level;
    int spelltype;

    if ( IS_NPC(victim) && ch->pcdata->followers > 4 )
   	{
		send_to_char("Nothing happens.\n\r",ch);
		return;
    }
	
    if ( IS_AFFECTED(victim, AFF_CHARM) )
    {
	send_to_char( "Nothing happens.\n\r", ch );
	return;
    }
	
    if ( !IS_AFFECTED(victim, AFF_CHARM) )
    {
	act("You stare deeply into $N's eyes.",ch,NULL,victim,TO_CHAR);
	act("$n stares deeply into $N's eyes.",ch,NULL,victim,TO_NOTVICT);
	act("$n stares deeply into your eyes.",ch,NULL,victim,TO_VICT);
    }

    if ( ( sn = skill_lookup( "charm person" ) ) < 0 ) return;
    spelltype = skill_table[sn].target;
    level = get_disc(ch,DISC_PRESENCE) * 10;

    if (!IS_NPC(victim) && (IS_VAMPIRE(victim)) &&
	get_disc(victim,DISC_PRESENCE) >= get_disc(ch,DISC_PRESENCE) )
    {
		act("$N shrugs off your attempt to entrance $M.",ch,NULL,victim,TO_CHAR);
		act("$N shrugs off $n's attempt to entrance $M.",ch,NULL,victim,TO_NOTVICT);
		act("You shrug off $n's attempt to entrance you.",ch,NULL,victim,TO_VICT);
	return;
    }

    if (!IS_NPC(victim) && ((victim->pcdata->willpower >= number_range(2,30) && 
		IS_ADDED(victim, ADDED_LOYAL)) || victim->pcdata->willpower >= number_range(10,30)) &&
		strlen(victim->pcdata->conding) > 1)
	{
		act("$N shrugs off your attempt to entrance $M.",ch,NULL,victim,TO_CHAR);
		act("$N shrugs off $n's attempt to entrance $M.",ch,NULL,victim,TO_NOTVICT);
		act("You shrug off $n's attempt to entrance you.",ch,NULL,victim,TO_VICT);
		return;
    }

    (*skill_table[sn].spell_fun) ( sn, level, ch, victim );

    if ( !IS_AFFECTED(victim, AFF_CHARM) )
    {
		act("$N shrugs off your attempt to entrance $M.",ch,NULL,victim,TO_CHAR);
		act("$N shrugs off $n's attempt to entrance $M.",ch,NULL,victim,TO_NOTVICT);
		act("You shrug off $n's attempt to entrance you.",ch,NULL,victim,TO_VICT);
	}

    act("$N gazes lovingly back at $n.",ch,NULL,victim,TO_NOTVICT);
    
    if (IS_NPC(victim))
    {
    	victim->lord = g_string_assign(victim->lord,ch->name->str);
    	ch->pcdata->followers++;
    }
    return;
}

void power_majesty( CHAR_DATA *ch, CHAR_DATA *victim, char *argument )
{
	char arg1[MAX_INPUT_LENGTH];
	char arg2[MAX_INPUT_LENGTH];
	char buf[MAX_STRING_LENGTH];
	int value;
	
	smash_tilde( argument );
	argument = one_argument( argument, arg1 );
	str_cpy( arg2, argument );
	
	if (arg1[0] != '\0' && !str_cmp(arg1,"on"))
	{
		if (IS_EXTRA(ch, EXTRA_FAKE_CON))
		{send_to_char("You already have Majesty on.\n\r",ch); return;}
		SET_BIT(ch->extra, EXTRA_FAKE_CON);
		send_to_char("Your Majesty is now ON.\n\r",ch);
		return;
	}
	if (arg1[0] != '\0' && !str_cmp(arg1,"off"))
	{
		if (!IS_EXTRA(ch, EXTRA_FAKE_CON))
		{send_to_char("You already have Majesty off.\n\r",ch); return;}
		REMOVE_BIT(ch->extra, EXTRA_FAKE_CON);
		send_to_char("Your Majesty is now OFF.\n\r",ch);
		return;
	}
	if ( arg1[0] == '\0' || arg2[0] == '\0' )
	{
		send_to_char("You have the following stats:\n\r",ch);
		sprintf(buf,"Hitroll: %d, Actual: %d.\n\r",
			ch->pcdata->fake_hit, char_hitroll(ch));
		send_to_char(buf, ch);
		sprintf(buf,"Damroll: %d, Actual: %d.\n\r",
			ch->pcdata->fake_dam, char_damroll(ch));
		send_to_char(buf, ch);
		sprintf(buf,"Armour: %d, Actual: %d.\n\r",
			ch->pcdata->fake_ac, char_ac(ch));
		send_to_char(buf, ch);
		sprintf(buf,"Hp: %d, Actual: %d.\n\r",
			ch->pcdata->fake_hp, ch->hit);
		send_to_char(buf, ch);
		sprintf(buf,"Mana: %d, Actual: %d.\n\r",
			ch->pcdata->fake_mana, ch->mana);
		send_to_char(buf, ch);
		sprintf(buf,"Move: %d, Actual: %d.\n\r",
			ch->pcdata->fake_move, ch->move);
		send_to_char(buf, ch);
		return;
	}
	value = is_number( arg2 ) ? atoi( arg2 ) : -10000;
	if (!str_cmp(arg1,"hit") || !str_cmp(arg1,"hitroll"))
	{
		if (value < 0 || value > 1000)
		{
			send_to_char("Please enter a value between 0 and 1000.\n\r",ch);
			return;
		}
		ch->pcdata->fake_hit = value;
		send_to_char("Ok.\n\r",ch);
		return;
	}
	if (!str_cmp(arg1,"dam") || !str_cmp(arg1,"damroll"))
	{
		if (value < 0 || value > 1000)
		{
			send_to_char("Please enter a value between 0 and 1000.\n\r",ch);
			return;
		}
		ch->pcdata->fake_dam = value;
		send_to_char("Ok.\n\r",ch);
		return;
	}
	if (!str_cmp(arg1,"ac") || !str_cmp(arg1,"armour") || !str_cmp(arg1,"armor"))
	{
		if (value < -1000 || value > 100)
		{
			send_to_char("Please enter a value between -1000 and 100.\n\r",ch);
			return;
		}
		ch->pcdata->fake_ac = value;
		send_to_char("Ok.\n\r",ch);
		return;
	}
	if (!str_cmp(arg1,"hp") || !str_cmp(arg1,"hitpoints"))
	{
		if (value < 1 || value > 120000)
		{
			send_to_char("Please enter a value between 1 and 120000.\n\r",ch);
			return;
		}
		ch->pcdata->fake_hp = value;
		send_to_char("Ok.\n\r",ch);
		return;
	}
	if (!str_cmp(arg1,"mana"))
	{
		if (value < 1 || value > 120000)
		{
			send_to_char("Please enter a value between 1 and 120000.\n\r",ch);
			return;
		}
		ch->pcdata->fake_mana = value;
		send_to_char("Ok.\n\r",ch);
		return;
	}
	if (!str_cmp(arg1,"move"))
	{
		if (value < 1 || value > 120000)
		{
			send_to_char("Please enter a value between 1 and 120000.\n\r",ch);
			return;
		}
		ch->pcdata->fake_move = value;
		send_to_char("Ok.\n\r",ch);
		return;
	}
	send_to_char("You can set: Hit, Dam, Ac, Hp, Mana, Move.\n\r",ch);
	return;
}

void power_gaze( CHAR_DATA *ch, CHAR_DATA *victim, char *argument )
{
	CHAR_DATA *mount;
	int victimclass, chclass;
	
	if (IS_CLASS(victim, CLASS_VAMPIRE) )
	{
		if ( get_disc(ch,DISC_PRESENCE) >= get_disc(victim,DISC_PRESENCE))
		{
			if (ch->race <= 0 ) chclass = 0;
			else if (ch->race <= 4 ) chclass = 1;
			else if (ch->race <= 9 ) chclass = 2;
			else if (ch->race <= 14) chclass = 3;
			else if (ch->race <= 19) chclass = 4;
			else if (ch->race <= 24) chclass = 5;
			else chclass = 6;
			
			if (victim->race <= 0 ) victimclass = 0;
			else if (victim->race <= 4 ) victimclass = 1;
			else if (victim->race <= 9 ) victimclass = 2;
			else if (victim->race <= 14) victimclass = 3;
			else if (victim->race <= 19) victimclass = 4;
			else if (victim->race <= 24) victimclass = 5;
			else victimclass = 6;
			
			if ( victimclass < chclass )
			{
				send_to_char( "You recall from combat!\n\r", victim );
				stop_fighting( ch, TRUE );
				
				act( "$N disappears.", ch, NULL, victim, TO_ROOM );
				char_from_room( victim );
				char_to_room( victim, get_room_index( ROOM_VNUM_TEMPLE ) );
				act( "$N appears in the room.", ch, NULL, victim, TO_ROOM );
				do_look( victim, "auto" );
				if ( ( mount = victim->mount ) == NULL ) return;
				char_from_room( mount );
				char_to_room( mount, victim->in_room );
			}
			else
				send_to_char("You failed!\n\r",ch);
		}	
	}
	else
		send_to_char("You can only gaze upon other Kindred.\n\r",ch);
	return;
}

void power_awe( CHAR_DATA *ch, CHAR_DATA *victim, char *argument )
{
	int victimclass, chclass;
	
	if (IS_CLASS(victim, CLASS_VAMPIRE) )
	{
		if ( get_disc(ch,DISC_PRESENCE) >= get_disc(victim,DISC_PRESENCE))
		{
			if (ch->race <= 0 ) chclass = 0;
			else if (ch->race <= 4 ) chclass = 1;
			else if (ch->race <= 9 ) chclass = 2;
			else if (ch->race <= 14) chclass = 3;
			else if (ch->race <= 19) chclass = 4;
			else if (ch->race <= 24) chclass = 5;
			else chclass = 6;
			
			if (victim->race <= 0 ) victimclass = 0;
			else if (victim->race <= 4 ) victimclass = 1;
			else if (victim->race <= 9 ) victimclass = 2;
			else if (victim->race <= 14) victimclass = 3;
			else if (victim->race <= 19) victimclass = 4;
			else if (victim->race <= 24) victimclass = 5;
			else victimclass = 6;
			
			if ( victimclass <= chclass )
			{
				do_follow(victim,ch->name->str);	
			}
			else
				send_to_char("You failed!\n\r",ch);
		}	
	}
	else
		send_to_char("You can only awe other Kindred.\n\r",ch);
	return;
}

void power_vsummon( CHAR_DATA *ch,CHAR_DATA *victim, char *argument )
{
	CHAR_DATA *mount;
	int sum_chance;
	
	if ( ch->mana < 500 )
	{
		send_to_char("You have insufficient mana.\n\r",ch);
		return;
	}
	
	sum_chance = number_percent();	
	ch->mana -= 500;
	
	if (  victim == ch
		||   victim->in_room == NULL
		||   sum_chance > 50
		||   is_tempsafe(ch) 
		||   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)
		||   (IS_NPC(victim) && victim->level >= 60)
		||   (!IS_NPC(victim) && IS_IMMORTAL(victim))
		||	 (!IS_NPC(victim) && victim->pcdata->obeah > 0)
		||   victim->fighting != NULL
		||   victim->in_room->area != ch->in_room->area
		||   (strstr(victim->in_room->area->builders, "Unlinked" )))
	{
		send_to_char( "You failed.\n\r", ch );
		return;
	}

	act( "$n disappears suddenly.", victim, NULL, NULL, TO_ROOM );
	char_from_room( victim );
	char_to_room( victim, ch->in_room );
	act( "$n arrives suddenly.", victim, NULL, NULL, TO_ROOM );
	act( "$N has summoned you!", victim, NULL, ch,   TO_CHAR );
	do_look( victim, "auto" );
	if ( (mount = victim->mount) == NULL ) return;
	char_from_room( mount );
	char_to_room( mount, get_room_index(victim->in_room->vnum) );
	do_look( mount, "auto" );
	return;
}

void power_change( CHAR_DATA *ch, CHAR_DATA *victim, char *argument )
{
	char arg [MAX_INPUT_LENGTH]; 
	char buf [MAX_STRING_LENGTH]; 
	
    argument = one_argument( argument, arg ); 
	
	if (IS_POLYAFF(ch, POLY_ZULO))
    {
	send_to_char( "Not while in Zulo Form.\n\r", ch );
	return;
    }

	if (IS_POLYAFF(ch, POLY_CHANGELING))
    {
	send_to_char( "Not while in changeling Form.\n\r", ch );
	return;
    }
	if (IS_POLYAFF(ch, POLY_BONECRAFT))
    {
	send_to_char( "Not while in bonecraft Form.\n\r", ch );
	return;
    }
	
    if ( arg[0] == '\0' )
	{
		send_to_char( "You can change between 'human', 'bat', 'wolf' and 'mist' forms.\n\r", ch );
		return;
	}


	if ( !str_cmp(arg,"bat") )
	{
		if (get_disc(ch,DISC_PROTEAN) < 3 )
		{
			send_to_char("You are not trained Protean 3 discipline.\n\r",ch);
			return;
		}
		
		if (IS_AFFECTED(ch, AFF_POLYMORPH))
		{
			send_to_char( "You can only polymorph from human form.\n\r", ch );
			return;
		}
		if (ch->stance[0] != -1) do_stance(ch,"");
		if (ch->mounted == IS_RIDING) do_dismount(ch,"");
		clear_stats(ch);
		act( "You transform into bat form.", ch, NULL, NULL, TO_CHAR );
		act( "$n transforms into a bat.", ch, NULL, NULL, TO_ROOM );
		SET_BIT(ch->pcdata->stats[UNI_AFF], VAM_FLYING);
		SET_BIT(ch->pcdata->stats[UNI_AFF], VAM_SONIC);
		SET_BIT(ch->pcdata->powers[WOLF_POLYAFF], POLY_BAT);
		SET_BIT(ch->pcdata->stats[UNI_AFF], VAM_CHANGED);
		SET_BIT(ch->affected_by, AFF_POLYMORPH);
		sprintf(buf, "%s the vampire bat", ch->name->str);
		ch->morph = g_string_assign(ch->morph,buf);
		return;
	}
	else if ( !str_cmp(arg,"wolf") )
	{
		if (get_disc(ch,DISC_PROTEAN) < 4 )
		{
			send_to_char("You are not trained Protean 4 discipline.\n\r",ch);
			return;
		}
		if (IS_AFFECTED(ch, AFF_POLYMORPH))
		{
			send_to_char( "You can only polymorph from human form.\n\r", ch );
			return;
		}
		if (ch->stance[0] != -1) do_stance(ch,"");
		if (ch->mounted == IS_RIDING) do_dismount(ch,"");
		act( "You transform into wolf form.", ch, NULL, NULL, TO_CHAR );
		act( "$n transforms into a dire wolf.", ch, NULL, NULL, TO_ROOM );
		clear_stats(ch);
		if (ch->wpn[0] > 0)
		{
			ch->hitroll += (ch->wpn[0]);
			ch->damroll += (ch->wpn[0]);
			ch->armor   -= (ch->wpn[0] * 3);
		}
		ch->pcdata->mod_str = 10;
		SET_BIT(ch->pcdata->powers[WOLF_POLYAFF], POLY_WOLF);
		SET_BIT(ch->affected_by, AFF_POLYMORPH);
		SET_BIT(ch->pcdata->stats[UNI_AFF], VAM_CHANGED);
		ch->max_hit = ch->max_hit + 500;
		ch->hit = ch->hit + 500;
		sprintf(buf, "%s the dire wolf", ch->name->str);
		ch->morph = g_string_assign(ch->morph,buf);
		return;
	}
	else if ( !str_cmp(arg,"mist") )
	{
		if (get_disc(ch,DISC_PROTEAN) < 5 )
		{
			send_to_char("You are not trained Protean 5 discipline.\n\r",ch);
			return;
		}
		if (IS_AFFECTED(ch, AFF_POLYMORPH))
		{
			send_to_char( "You can only polymorph from human form.\n\r", ch );
			return;
		}
		if (ch->stance[0] != -1) do_stance(ch,"");
		if (ch->mounted == IS_RIDING) do_dismount(ch,"");
		act( "You transform into mist form.", ch, NULL, NULL, TO_CHAR );
		act( "$n transforms into a white mist.", ch, NULL, NULL, TO_ROOM );
		if (IS_EXTRA(ch, TIED_UP))
		{
			act("The ropes binding you fall through your ethereal form.",ch,NULL,NULL,TO_CHAR);
			act("The ropes binding $n fall through $s ethereal form.",ch,NULL,NULL,TO_ROOM);
			REMOVE_BIT(ch->extra, TIED_UP);
			REMOVE_BIT(ch->extra, GAGGED);
			REMOVE_BIT(ch->extra, BLINDFOLDED);
		}
		if (is_affected(ch, gsn_web))
		{
			act("The webbing entrapping $n falls through $s ethereal form.",ch,NULL,NULL,TO_ROOM);
			send_to_char("The webbing entrapping you falls through your ethereal form.\n\r",ch);
			affect_strip(ch, gsn_web);
		}
		clear_stats(ch);
		SET_BIT(ch->pcdata->powers[WOLF_POLYAFF], POLY_MIST);
		SET_BIT(ch->pcdata->stats[UNI_AFF], VAM_CHANGED);
		SET_BIT(ch->affected_by, AFF_POLYMORPH);
		ch->plane = PLANE_ETHEREAL;
		shift_obj_plane(ch);
		sprintf(buf, "%s the white mist", ch->name->str);
		ch->morph = g_string_assign(ch->morph,buf);
		strip_player(ch);
		return;
	}
/*    else if ( !str_cmp(arg,"human") )
    {
	if (!IS_AFFECTED(ch, AFF_POLYMORPH))
	{
	    send_to_char( "You are already in human form.\n\r", ch );
    	free_string( ch->morph );
    	ch->morph = str_dup( buf );
	return;
    } */
	else if ( !str_cmp(arg,"human") )
	{
		if (!IS_AFFECTED(ch, AFF_POLYMORPH))
		{
			send_to_char( "You are already in human form.\n\r", ch );
			return;
		}
		if (IS_VAMPAFF(ch, VAM_CHANGED) && IS_SET(ch->pcdata->powers[WOLF_POLYAFF], POLY_BAT))
		{
			REMOVE_BIT(ch->pcdata->stats[UNI_AFF], VAM_FLYING);
			REMOVE_BIT(ch->pcdata->stats[UNI_AFF], VAM_SONIC);
			REMOVE_BIT(ch->pcdata->powers[WOLF_POLYAFF], POLY_BAT);
		}
		else if (IS_VAMPAFF(ch, VAM_CHANGED) && IS_SET(ch->pcdata->powers[WOLF_POLYAFF], POLY_WOLF))
		{
			REMOVE_BIT(ch->pcdata->powers[WOLF_POLYAFF], POLY_WOLF);
			ch->max_hit = ch->max_hit - 500;
			ch->hit = ch->hit - 500;
			if (ch->hit < 1) ch->hit = 1;
		}
		else if (IS_VAMPAFF(ch, VAM_CHANGED) && IS_SET(ch->pcdata->powers[WOLF_POLYAFF], POLY_MIST))
		{
			REMOVE_BIT(ch->pcdata->powers[WOLF_POLYAFF], POLY_MIST);
			ch->plane = PLANE_NORMAL;
			shift_obj_plane(ch);
		}
		else
		{
	    /* In case they try to change to human from a non-vamp form */
			send_to_char( "You seem to be stuck in this form.\n\r", ch );
			return;
		}
		act( "You transform into human form.", ch, NULL, NULL, TO_CHAR );
		act( "$n transforms into human form.", ch, NULL, NULL, TO_ROOM );
		REMOVE_BIT(ch->affected_by, AFF_POLYMORPH);
		REMOVE_BIT(ch->pcdata->stats[UNI_AFF], VAM_CHANGED);
		clear_stats(ch);
		ch->morph = g_string_assign(ch->morph,"");
		return;
	}
	else
		send_to_char("You can change between 'human', 'bat', 'wolf' and 'mist' forms.\n\r", ch);
	return;
}
void power_earthmeld( CHAR_DATA *ch,CHAR_DATA *victim, char * argument )
{
	if (ch->pcdata->stats[UNI_RAGE] > 0)
	{
		send_to_char("You cannot control your melding abilities while the beast is so strong.\n\r",ch);
		return;
	}
	if ( ch->position == POS_FIGHTING )
	{
		send_to_char( "No way! You are fighting.\n\r", ch );
		return;
	}
	if ( ch->pk_timer > 0 )
	{
		send_to_char("You can't meld while still frenzied from last combat.\n\r",ch);
		return;
	}
	
	if ( ch->plane == PLANE_EARTH)
	{
		ch->plane = PLANE_NORMAL;
		shift_obj_plane(ch);
		act("$n reforms into thier normal stature.",ch,NULL,NULL,TO_ROOM);
		send_to_char("You reform into your normal stature.\n\r",ch);
        return;		
	}
	else
	{
		ch->plane = PLANE_EARTH;
		shift_obj_plane(ch);
		send_to_char("You become one with the earth, as you seep into the ground.\n\r",ch);
		act("$n becomes one with the earth, as they seep into the ground.",ch,NULL,NULL,TO_ROOM);
	    return;
    }
    return;
}

void power_marble( CHAR_DATA *ch, CHAR_DATA *victim, char * argument )
{
	if ( IS_SET(ch->act,PLR_MARBLEFLESH))
	{
		REMOVE_BIT(ch->act,PLR_MARBLEFLESH);
		send_to_char("Your marble skin reforms in to soft flesh.\n\r",ch);
		
	}
	else
	{
		SET_BIT(ch->act,PLR_MARBLEFLESH);
		send_to_char("You soft flesh becomes hard as marble!\n\r",ch);
	}	
}

void power_spit( CHAR_DATA *ch, CHAR_DATA *victim, char *argument )
{
    int dam;
    int stance;

    dam = number_range(10,20);

    dam += char_damroll(ch);
    if (dam == 0) dam = 1;
    if ( !IS_AWAKE(victim) )
	dam *= 2;
    if ( !IS_NPC(ch) && get_disc(ch,DISC_POTENCE) > 0)
	dam += dam * (int)((double)get_disc(ch,DISC_POTENCE) * 0.3);
    
    if ( !IS_NPC(ch) ) dam = dam + (dam * (int)(((double)ch->wpn[0]) * 0.01));
/*
    if ( !IS_NPC(ch) )
*/
    {
	stance = ch->stance[0];
	if ( IS_STANCE(ch, STANCE_NORMAL) ) 
			dam =  (int)((double)dam * 1.25);
	else dam = dambonus(ch,victim,dam,stance);
    }

    if ( dam <= 0 )
	dam = 1;
		
    damage( ch, victim, dam, TYPE_SPIT );

    return;
}

void power_silent( CHAR_DATA *ch, CHAR_DATA *victim, char *argument )
{
	AFFECT_DATA paf;
	
	if ( IS_RAFFECTED(ch->in_room, ROOM_AFF_SILENT ))
	{
		send_to_char("You can't silence a silent room.\n\r",ch);
		return;
	}
	
	paf.duration  = 5;
	paf.bitvector = ROOM_AFF_SILENT;
	affect_to_room( ch->in_room, &paf );
	
	act( "All sounds fade into a complete silence.", ch, NULL, NULL, TO_ROOM );
	act( "All sounds fade into a complete silence.", ch, NULL, NULL, TO_CHAR );
	ch->silent_time = 10;
	return;
}

void power_weaken( CHAR_DATA *ch, CHAR_DATA *victim, char *argument)
{
	char buf [MAX_STRING_LENGTH];
	if (!IS_CLASS(victim, CLASS_VAMPIRE))
	{
		send_to_char( "That victim does not have any blood you can weaken!\n\r", ch );
		return;
	}
	
	victim->pcdata->condition[COND_THIRST] -= 10;
	sprintf(buf,"%s's hand seems to drain your lifeforce.\n\r",ch->name->str);
	send_to_char(buf,victim);
	sprintf(buf,"You drain %s with all you got!\n\r",victim->name->str);
	send_to_char(buf,ch);
}

void power_disease( CHAR_DATA *ch, CHAR_DATA *victim, char *argument)
{
	char buf [MAX_STRING_LENGTH];
	AFFECT_DATA af;
	
    if (!IS_CLASS(victim, CLASS_VAMPIRE))
	{
		send_to_char( "You cannot disease that victim!\n\r", ch );
		return;
	}
	
	af.type      = MAX_SKILL + 2;
	af.duration  = 5;
	af.location  = APPLY_NONE;
	af.modifier  = 0;
	af.bitvector = AFF_DISEASE;
	affect_to_char( victim, &af );
	
	sprintf(buf,"Blood trickles out of %s's ears, nose and mouth.\n\r",victim->name->str);
	send_to_char(buf,ch);
}

void power_agony(CHAR_DATA *ch,CHAR_DATA *victim, char *argument)
{
	OBJ_DATA *obj;
	AFFECT_DATA af;
	
    /* find out what */
	if (argument[0] == '\0')
	{
		send_to_char("Agony what item?\n\r",ch);
		return;
	}
	
	obj =  get_obj_list(ch,argument,ch->carrying);
	
	if (obj== NULL)
	{
		send_to_char("You don't have that item.\n\r",ch);
		return;
	}
	
	if (obj->item_type == ITEM_WEAPON)
	{
		
		if ( obj->value[0] != 0)
		{
			act("$p cannot be used.",ch,obj,NULL,TO_CHAR);
			return;
		}
		
		af.where     = TO_WEAPON;
		af.type      = gsn_poison;
		af.duration  = 5;
		af.location  = APPLY_NONE;
		af.modifier  = 0;
		af.bitvector = WEAPON_POISON;
		affect_to_obj(obj,&af);
		
		obj->value[0] = 141;
		act("$n coats $p with deadly blood.",ch,obj,NULL,TO_ROOM);
		act("You coat $p with blood.",ch,obj,NULL,TO_CHAR);
		return;
	}
}

void power_darkheart( CHAR_DATA *ch, CHAR_DATA *victim, char *argument )
{
	if (IS_IMMUNE(ch,IMM_STAKE) )
	{
		send_to_char("But you've already torn your heart out!\n\r",ch);
		return;
	}
	send_to_char("You rip your heart from your body and toss it to the ground.\n\r",ch);
	act("$n rips $s heart out and tosses it to the ground.", ch, NULL, NULL, TO_ROOM);
	make_part( ch, "heart" );
	ch->hit = ch->hit - number_range(10,20);
	update_pos(ch);
	if (ch->position == POS_DEAD && !IS_HERO(ch))
	{
		send_to_char( "{RYou have been KILLED!!{x\n\r\n\r", ch );
		raw_kill(ch);
		return;
	}
	SET_BIT(ch->immune, IMM_STAKE);
	return;
}

void power_serpent( CHAR_DATA *ch,CHAR_DATA *victim, char *argument )
{
	char buf [MAX_STRING_LENGTH]; 
	
	if (IS_SET(ch->pcdata->powers[WOLF_POLYAFF], POLY_ZULO))
    {
    	send_to_char( "Not while in Zulo Form.\n\r", ch );
    	return;
    }

	if (IS_SET(ch->pcdata->powers[WOLF_POLYAFF], POLY_CHANGELING))
    {
    	send_to_char( "Not while in changeling Form.\n\r", ch );
    	return;
    }
	if (IS_SET(ch->pcdata->powers[WOLF_POLYAFF], POLY_BONECRAFT))
    {
       send_to_char( "Not while in bonecraft Form.\n\r", ch );
    	return;
    }


	if (IS_AFFECTED(ch, AFF_POLYMORPH))
	{
		if (!IS_POLYAFF(ch,POLY_SERPENT))
		{
			send_to_char( "You cannot polymorph from this form.\n\r", ch );
			return;
		}
		act( "You transform back into human.", ch, NULL, NULL, TO_CHAR );
		act( "$n transform into human form.", ch, NULL, NULL, TO_ROOM );
		REMOVE_BIT(ch->polyaff, POLY_SERPENT);
		REMOVE_BIT(ch->affected_by, AFF_POLYMORPH);
		clear_stats(ch);
		ch->morph = g_string_assign(ch->morph,"");
		ch->max_hit = ch->max_hit - 250;
		ch->hit = ch->hit - 250;
		if (ch->hit < 1) ch->hit = 1;
		ch->max_mana = ch->max_mana + 50;
		return;
	}
	clear_stats(ch);
	if (ch->wpn[0] > 0)
	{
		ch->hitroll +=  (int)((double)ch->wpn[0] * 0.75);
		ch->damroll +=  (int)((double)ch->wpn[0] * 0.75);
		ch->armor   -= ch->wpn[0] * 3;
	}
	if (ch->stance[0] != -1) do_stance(ch,"");
	if (ch->mounted == IS_RIDING) do_dismount(ch,"");
	ch->pcdata->mod_str = 10;
	act( "You transform into a huge serpent.", ch, NULL, NULL, TO_CHAR );
	act( "$n transforms into a huge serpent.", ch, NULL, NULL, TO_ROOM );
	SET_BIT(ch->polyaff, POLY_SERPENT);
	SET_BIT(ch->affected_by, AFF_POLYMORPH);
	sprintf(buf, "%s the huge serpent", ch->name->str);
	ch->morph = g_string_assign(ch->morph,buf);
	ch->max_hit = ch->max_hit + 250;
	ch->hit = ch->hit + 250;
	ch->max_mana = ch->max_mana - 50;
	return;
}

void power_breath( CHAR_DATA *ch, CHAR_DATA *victim, char *argument)
{
	int       dam;
	
	if (ch->fighting == NULL) 
		set_fighting(ch,victim);
	dam = dice((int)((double)ch->spl[skill_table[1].target] * .25) * 10, 20 );
	damage( ch, victim, dam, 1 );
}

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

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

    if (IS_POLYAFF(ch, POLY_BONECRAFT))
    {
        send_to_char( "Not while in bonecraft Form.\n\r", ch );
        return;
    }


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

    if ( IS_IMMORTAL(victim) && victim != ch )
    {
        send_to_char( "You can only change to look like avatars or lower.\n\r", ch );
        return;
    }
    if (victim->sex != ch->sex)
    {
        send_to_char( "You can only change to look like people of the same sex as you.\n\r", ch );
        return;
    }

    if ( ch == victim )
    {
        if (!IS_AFFECTED(ch,AFF_POLYMORPH) && !IS_VAMPAFF(ch,VAM_DISGUISED))
        {
            send_to_char( "You already look like yourself!\n\r", ch );
            return;
        }
        if (!IS_POLYAFF(ch, POLY_CHANGELING))
        {
            send_to_char( "Nothing happens.\n\r", ch );
            return;
        }
        sprintf(buf,"$n's features twist and distort until $e looks like %s.",ch->name->str);
        act(buf,ch,NULL,NULL,TO_ROOM);
        REMOVE_BIT(ch->polyaff, POLY_CHANGELING);
        REMOVE_BIT(ch->affected_by, AFF_POLYMORPH);
        REMOVE_BIT(ch->pcdata->stats[UNI_AFF], VAM_CHANGED);
        ch->morph = g_string_assign(ch->morph,"");
        act("Your features twist and distort until you looks like $n.",ch,NULL,NULL,TO_CHAR);
        return;
    }

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


    if (IS_SET(ch->pcdata->stats[UNI_AFF], VAM_CHANGED))
    {
        if (!IS_POLYAFF(ch, POLY_CHANGELING))
        {
            send_to_char( "Nothing happens.\n\r", ch );
            return;
        }
        SET_BIT(ch->polyaff, POLY_CHANGELING);
        SET_BIT(ch->affected_by, AFF_POLYMORPH);
        act("Your features twist and distort until you looks like $N.",ch,NULL,victim,TO_CHAR);
        act("$n's features twist and distort until $e looks like you.",ch,NULL,victim,TO_VICT);
        act("$n's features twist and distort until $e looks like $N.",ch,NULL,victim,TO_NOTVICT);
        ch->morph = g_string_assign(ch->morph,victim->name->str);
        return;
    }
    act("Your features twist and distort until you looks like $N.",ch,NULL,victim,TO_CHAR);
    act("$n's features twist and distort until $e looks like you.",ch,NULL,victim,TO_VICT);
    act("$n's features twist and distort until $e looks like $N.",ch,NULL,victim,TO_NOTVICT);
    SET_BIT(ch->polyaff, POLY_CHANGELING);
    SET_BIT(ch->affected_by, AFF_POLYMORPH);
    SET_BIT(ch->pcdata->stats[UNI_AFF], VAM_CHANGED);
    ch->morph = g_string_assign(ch->morph,victim->name->str);
    return;
}
void power_bonecraft( CHAR_DATA *ch,CHAR_DATA *victim, char *argument )
{
    char      buf [MAX_STRING_LENGTH];
    char      arg1 [MAX_INPUT_LENGTH];
    char      arg3 [MAX_INPUT_LENGTH];
    
    one_argument( argument, arg1 );
    smash_tilde(argument);

    if ( argument[0] == '\0' || arg1[0] == '\0' )
    {
	send_to_char( "Change to look like whom?\n\r", ch );
	return;
    }
	
	if (!str_cmp(arg1,"mod") || !str_cmp(arg1,"modify"))
    {
		argument = one_argument( argument, arg1 );
		argument = one_argument( argument, arg3 );
		if (arg1[0] == '\0' || arg3[0] == '\0')
		{
	   		send_to_char("Syntax: Bonecraft Modify <target> <modification>\n\r",ch);
	    	return;
		}
		
        if (IS_NPC(victim))
		{
	    send_to_char( "You cannot bonecraft an unwilling person.\n\r", ch );
	    return;
		}
		if (!IS_IMMUNE(victim,IMM_VAMPIRE) && ch != victim)
		{
	    send_to_char( "You cannot bonecraft an unwilling person.\n\r", ch );
	    return;
		}

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

		if (IS_POLYAFF(victim, POLY_CHANGELING))
    	{
		send_to_char( "Not while in changeling Form.\n\r", ch );
		return;
    	}

		if (!str_cmp(arg3,"tusks"))
		{
	    if (IS_MOD(victim, MOD_TUSKS))
	    {
		if (ch == victim)
		{
		    send_to_char("You push your tusks back into your jaw bone!\n\r",ch);
		    act("$n pushes $s tusks back $s jaw bone!",ch,NULL,NULL,TO_ROOM);
		}
		else
		{
		    act("You push $N's tusks back into $S jaw bone!",ch,NULL,victim,TO_CHAR);
		    act("$n pushes your tusks back into your jaw bone!",ch,NULL,victim,TO_VICT);
		    act("$n pushes $N's tusks back into $S jaw bone!",ch,NULL,victim,TO_NOTVICT);
		}
		REMOVE_BIT(victim->pcdata->bodymods, MOD_TUSKS);
	    }
	    else
	    {
		if (ch == victim)
		{
		    send_to_char("You pull a pair of tusks out of your jaw bone!\n\r",ch);
		    act("$n pulls a pair of tusks out of $s jaw bone!",ch,NULL,NULL,TO_ROOM);
		}
		else
		{
		    act("You pull a pair of tusks out of $N's jaw bone!",ch,NULL,victim,TO_CHAR);
		    act("$n pulls a pair of tusks out of your jaw bone!",ch,NULL,victim,TO_VICT);
		    act("$n pulls a pair of tusks out of $N's jaw bone!",ch,NULL,victim,TO_NOTVICT);
		}
		SET_BIT(victim->pcdata->bodymods, MOD_TUSKS);
	    }
	}
	else if (!str_cmp(arg3,"horns"))
	{
	    if (IS_MOD(victim, MOD_HORNS))
	    {
		if (ch == victim)
		{
		    send_to_char("You push your horns back into the bone of your skull!\n\r",ch);
		    act("$n pushes $s horns back into the bone of $s skull!",ch,NULL,NULL,TO_ROOM);
		}
		else
		{
		    act("You push $N's horns back into the bone of $S skull!",ch,NULL,victim,TO_CHAR);
		    act("$n pushes your horns back into the bone of your skull!",ch,NULL,victim,TO_VICT);
		    act("$n pushes $N's horns back into the bone of $S skull!",ch,NULL,victim,TO_NOTVICT);
		}
		REMOVE_BIT(victim->pcdata->bodymods, MOD_HORNS);
	    }
	    else
	    {
		if (ch == victim)
		{
		    send_to_char("You pull a pair of horns out of the bone of your skull!\n\r",ch);
		    act("$n pulls a pair of horns out of the bone of $s skull!",ch,NULL,NULL,TO_ROOM);
		}
		else
		{
		    act("You pull a pair of horns out of the bone of $N's skull!",ch,NULL,victim,TO_CHAR);
		    act("$n pulls a pair of horns out of the bone of your skull!",ch,NULL,victim,TO_VICT);
		    act("$n pulls a pair of horns out of the bone of $N's skull!",ch,NULL,victim,TO_NOTVICT);
		}
		SET_BIT(victim->pcdata->bodymods, MOD_HORNS);
	    }
	}
	else if (!str_cmp(arg3,"exoskeleton"))
	{
	    if (IS_MOD(victim, MOD_EXOSKELETON))
	    {
		if (ch == victim)
		{
		    send_to_char("You push your exoskeleton back under your skin!\n\r",ch);
		    act("$n pushes $s exoskeleton back under $s skin!",ch,NULL,NULL,TO_ROOM);
		}
		else
		{
		    act("You push $N's exoskeleton back under $S skin!",ch,NULL,victim,TO_CHAR);
		    act("$n pushes your exoskeleton back under your skin!",ch,NULL,victim,TO_VICT);
		    act("$n pushes $N's exoskeleton back under $S skin!",ch,NULL,victim,TO_NOTVICT);
		}
		REMOVE_BIT(victim->pcdata->bodymods, MOD_EXOSKELETON);
	    }
	    else
	    {
		if (ch == victim)
		{
		    send_to_char("You pull out an exoskeleton from under your skin!\n\r",ch);
		    act("$n pulls out an exoskeleton from under $s skin!",ch,NULL,NULL,TO_ROOM);
		}
		else
		{
		    act("You pull out an exoskeleton from under $N's skin!",ch,NULL,victim,TO_CHAR);
		    act("$n pulls out an exoskeleton from under your skin!",ch,NULL,victim,TO_VICT);
		    act("$n pulls out an exoskeleton from under $N's skin!",ch,NULL,victim,TO_NOTVICT);
		}
		SET_BIT(victim->pcdata->bodymods, MOD_EXOSKELETON);
	    }
	}
	else send_to_char( "You cannot do that.\n\r", ch );
	return;
    }

    if ( strlen(argument) > 20 )
    {
	send_to_char( "Please limit your name to 20 characters or less.\n\r", ch );
	return;
    }

    if ( str_cmp(argument,"self") && !check_parse_name( argument ) )
    {
	send_to_char( "Illegal name.\n\r", ch );
	return;
    }

    if (is_in(argument,"|kavir*dominoin*spiral*omega*arcite*enkindu*thanatos*fury*hypnos*jannick*"))
    {
	send_to_char( "Illegal name.\n\r", ch );
	return;
    }

    if (IS_AFFECTED(ch,AFF_POLYMORPH) && !IS_SET(ch->pcdata->stats[UNI_AFF], VAM_CHANGED))
    {
	send_to_char( "Not while polymorphed.\n\r", ch );
	return;
    }

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

    if ( !str_cmp(argument,ch->name->str) || !str_cmp(argument,"self") )
    {
		//if (!IS_AFFECTED(ch,AFF_POLYMORPH))
		//{
	   	//	send_to_char( "You already look like yourself!\n\r", ch );
	    //	return;
		//}
		if (!IS_POLYAFF(ch, POLY_BONECRAFT))
		{
	   		send_to_char( "Nothing happens.\n\r", ch );
	    	return;
		}
		sprintf(buf,"$n's features twist and distort until $e looks like %s.",ch->name->str);
		act(buf,ch,NULL,NULL,TO_ROOM);
		REMOVE_BIT(ch->polyaff, POLY_BONECRAFT);
		REMOVE_BIT(ch->affected_by, AFF_POLYMORPH);
		REMOVE_BIT(ch->pcdata->stats[UNI_AFF], VAM_CHANGED);
    	ch->morph = g_string_assign(ch->morph,"");
    	act("Your features twist and distort until you look like $n.",ch,NULL,NULL,TO_CHAR);
		return;
    }
    if (IS_SET(ch->pcdata->stats[UNI_AFF], VAM_CHANGED))
    {
		if (!IS_SET(ch->pcdata->powers[WOLF_POLYAFF], POLY_BONECRAFT))
		{
		    send_to_char( "Nothing happens.\n\r", ch );
		    return;
		}
		sprintf(buf,"Your features twist and distort until you look like %s.\n\r",argument);
		send_to_char(buf,ch);
		sprintf(buf,"$n's features twist and distort until $e looks like %s.",argument);
		act(buf,ch,NULL,NULL,TO_ROOM);
    	ch->morph = g_string_assign(ch->morph,argument);
    	return;
    }
    sprintf(buf,"Your features twist and distort until you look like %s.\n\r",argument);
    send_to_char(buf,ch);
    sprintf(buf,"$n's features twist and distort until $e looks like %s.",argument);
    act(buf,ch,NULL,NULL,TO_ROOM);
    SET_BIT(ch->polyaff, POLY_BONECRAFT);
    SET_BIT(ch->affected_by, AFF_POLYMORPH);
    SET_BIT(ch->pcdata->stats[UNI_AFF], VAM_CHANGED);
    ch->morph = g_string_assign(ch->morph,argument);
    return;
}
void power_counterspell( CHAR_DATA *ch, CHAR_DATA *victim, char *argument )
{
	AFFECT_DATA *paf;
	AFFECT_DATA *paf_next = NULL;
	
	if ( number_percent() > 70 )
	{
		send_to_char("You failed.\n\r",ch);
		return;	
	}
	
	if (!(victim->affected))
	{
		send_to_char( "Nothing happens.\n\r", ch );
		return;
	}
	
	for ( paf = victim->affected; paf != NULL; paf = paf_next )
	{
		paf_next = paf->next;
		if ( paf->type >= MAX_SKILL )
			continue;
		
		affect_remove(victim,paf);
		
	}
	
	if ( ch == victim )
	{
		act("You remove all magical affects from yourself.",ch,NULL,NULL,TO_CHAR);
		act("$n has removed all magical affects from $mself.",ch,NULL,NULL,TO_ROOM);
	}
	else
	{
		act("You remove all magical affects from $N.",ch,NULL,victim,TO_CHAR);
		act("$n has removed all magical affects from $N.",ch,NULL,victim,TO_NOTVICT);
		act("$n has removed all magical affects from you.",ch,NULL,victim,TO_VICT);
	}
	
	return;
}

void power_zuloform( CHAR_DATA *ch, CHAR_DATA *victim, char *argument )
{
	char buf [MAX_STRING_LENGTH]; 
	
	if (IS_POLYAFF(ch, POLY_CHANGELING))
    {
    	send_to_char( "Not while in changeling Form.\n\r", ch );
    	return;
    }
	if (IS_POLYAFF(ch, POLY_BONECRAFT))
    {
        send_to_char( "Not while in bonecraft Form.\n\r", ch );
    	return;
    }


	if (IS_VAMPAFF(ch, VAM_CHANGED) && IS_SET(ch->pcdata->powers[WOLF_POLYAFF], POLY_ZULO))
	{
		REMOVE_BIT(ch->pcdata->powers[WOLF_POLYAFF], POLY_ZULO);
		ch->max_hit = ch->max_hit - 1000;
		ch->hit = ch->hit - 1000;
		ch->armor -= 500;
		ch->damroll -= 250;
		
		if (ch->hit < 1) ch->hit = 1;
		act( "You transform into human form.", ch, NULL, NULL, TO_CHAR );
		act( "$n transforms into human form.", ch, NULL, NULL, TO_ROOM );
		REMOVE_BIT(ch->affected_by, AFF_POLYMORPH);
		REMOVE_BIT(ch->pcdata->stats[UNI_AFF], VAM_CHANGED);
		clear_stats(ch);
		ch->morph = g_string_assign(ch->morph,"");
		return;
	}
	
    if (IS_AFFECTED(ch, AFF_POLYMORPH))
	{
		send_to_char( "Your Bugged.\n\r", ch );
		return;
    }

	if (ch->stance[0] != -1) do_stance(ch,"");
	if (ch->mounted == IS_RIDING) do_dismount(ch,"");
	act( "Your flesh transforms in to a horrid form.", ch, NULL, NULL, TO_CHAR );
	act( "$n flesh twists and strechs in to a horrid shape.", ch, NULL, NULL, TO_ROOM );
	clear_stats(ch);
	SET_BIT(ch->pcdata->powers[WOLF_POLYAFF], POLY_ZULO);
	SET_BIT(ch->affected_by, AFF_POLYMORPH);
	SET_BIT(ch->pcdata->stats[UNI_AFF], VAM_CHANGED);
	ch->pcdata->mod_str = 15;
	ch->pcdata->mod_dex = 15;
	ch->armor += 500;
	ch->damroll += 250;
	ch->max_hit = ch->max_hit + 1000;
	ch->hit = ch->hit + 1000;
	sprintf(buf, "%s, the horrid beast", ch->name->str);
	ch->morph = g_string_assign(ch->morph,buf);
	return;
}

void power_essence( CHAR_DATA *ch, CHAR_DATA *victim, char *argument )
{
	OBJ_DATA *obj;
	int object_num;
	char buf [MAX_STRING_LENGTH]; 
	
	if (ch->pcdata->stats[UNI_RAGE] > 0)
	{
		send_to_char("You cannot control your melding abilities while the beast is so strong.\n\r",ch);
		return;
	}
	
    if ( ch->position == POS_FIGHTING )
	{
		send_to_char( "No way! You are fighting.\n\r", ch );
		return;
	}
	
    if ( ch->pk_timer > 0 )
	{
		send_to_char("You can't meld while still frenzied from last combat.\n\r",ch);
		return;
	}
	
	if (IS_AFFECTED(ch,AFF_POLYMORPH))
	{
		if ( ( obj = ch->pcdata->chobj ) == NULL )
		{
			send_to_char("You are already in human form.\n\r",ch);
			return;
		}
		ch->pcdata->obj_vnum = 0;
		obj->chobj = NULL;
		ch->pcdata->chobj = NULL;
		REMOVE_BIT(ch->affected_by, AFF_POLYMORPH);
		REMOVE_BIT(ch->extra, EXTRA_OSWITCH);
		ch->morph = g_string_assign(ch->morph,"");
		act("$p transforms into $n.",ch,obj,NULL,TO_ROOM);
		act("Your reform your human body.",ch,obj,NULL,TO_CHAR);
		extract_obj(obj);
		return;	
	}
	
    if (!strcmp(argument,"head"))
		object_num = OBJ_VNUM_SEVERED_HEAD;
	else if (!strcmp(argument,"brain"))
		object_num = OBJ_VNUM_QUIVERING_BRAIN;
	else if (!strcmp(argument,"blood"))
		object_num = OBJ_VNUM_SPILT_BLOOD;
	else
	{
		send_to_char("Selections: blood,head,brain.\n\r",ch);
		return;	
	}
	
    if (IS_AFFECTED(ch,AFF_POLYMORPH))
	{
		send_to_char("Your cannot change in to something else!\n\r",ch);
		return;	
	}
	
	if ((obj = create_object(get_obj_index(object_num),ch->level)) == NULL)
	{
		send_to_char( "You don't have the ability to change into a object.\n\r", ch);
		return;
	}
	
	if (strcmp(argument,"blood"))
	{
		sprintf( buf, obj->short_descr->str, ch->name->str );
		obj->short_descr = g_string_assign(obj->short_descr,buf);
		sprintf( buf, obj->name->str, ch->name->str );
		obj->name = g_string_assign(obj->name,buf);
		sprintf( buf, obj->description->str, ch->name->str );
		obj->description = g_string_assign(obj->description,buf);
		
		
	}
	
	if (IS_AFFECTED(ch,AFF_WEBBED))
	{
		send_to_char( "Not with all this sticky webbing on.\n\r", ch);
		return;
	}
	obj_to_room(obj,ch->in_room);
	act("$n transforms into $p and falls to the ground.",ch,obj,NULL,TO_ROOM);
	act("You transform into $p and fall to the ground.",ch,obj,NULL,TO_CHAR);
	ch->pcdata->obj_vnum = object_num;
	obj->chobj = ch;
	ch->pcdata->chobj = obj;
	SET_BIT(ch->affected_by, AFF_POLYMORPH);
	SET_BIT(ch->extra, EXTRA_OSWITCH);
	ch->morph = g_string_assign(ch->morph,obj->short_descr->str);
	return;
}

void power_poison( CHAR_DATA *ch, CHAR_DATA *victim, char *argument )
{
	OBJ_DATA  *obj;
	char       arg [MAX_INPUT_LENGTH];
	
	argument = one_argument( argument, arg );
	
	if ( ( ( obj = get_eq_char( ch, WEAR_WIELD ) ) == NULL )
		&&   ( ( obj = get_eq_char( ch, WEAR_HOLD ) ) == NULL ) )
	{
		send_to_char( "You must wield the weapon you wish to poison.\n\r", ch );
		return;
	}
	
	if ( obj->value[0] != 0 )
	{
		send_to_char( "This weapon cannot be poisoned.\n\r", ch );
		return;
	}
	
	act("You run your tongue along $p, poisoning it.",ch,obj,NULL,TO_CHAR);
	act("$n runs $s tongue along $p, poisoning it.",ch,obj,NULL,TO_ROOM);
	obj->value[0] = 53;
	obj->timer = number_range(10,20);
	
	return;
}

void power_fcommand( CHAR_DATA *ch, CHAR_DATA *victim, char *argument )
{
	char arg1[MSL];

    argument = one_argument(argument,arg1);


    if (victim != ch->pcdata->familiar)
    {
        send_to_char("They are not your familar.\n\r",ch);
        return;
    }

    if ( !check_dumbshit(arg1))
	{
		send_to_char("You can't forthem to do that!\n\r",ch);
		return;
	}
	
    interpret(victim,arg1);
	
    return;
}

void power_cloak( CHAR_DATA *ch,CHAR_DATA *victim, char * argument )
{
	if ( IS_SET(ch->added,ADDED_CLOAK))
	{
		REMOVE_BIT(ch->added,ADDED_CLOAK);
		send_to_char("Your equipment becomes visible!.\n\r",ch);
	
	}
	else
	{
		SET_BIT(ch->added,ADDED_CLOAK);
		send_to_char("You try to make your equipment disappear.\n\r",ch);
		return;
	}	
	return;
}


void power_fear( CHAR_DATA *ch, CHAR_DATA *victim, char *argument )
{
    AFFECT_DATA af;
    int sn;
    int level;

    if ( IS_AFFECTED(victim, AFF_FEAR) )
    {
		send_to_char( "They are already pretty scared.\n\r", ch );
		return;
    }
	
    if ( IS_ADDED(victim, ADDED_COURAGE) )
    {
		send_to_char( "They are far too brave to be scared so easily.\n\r", ch );
		return;
    }

    if (!IS_NPC(victim) && IS_CLASS(victim,CLASS_VAMPIRE) && 
	get_disc(victim,DISC_DAIMOINON) >= 
	get_disc(ch,DISC_DAIMOINON))
    {
		send_to_char( "Your Consuming Fear has no effect on them.\n\r", ch );
		return;
    }

	level = get_disc(ch,DISC_DAIMOINON) * 5;

    if ( saves_spell( level, victim ) && victim->position >= POS_FIGHTING )
    {
		act("$E ignores you.",ch,NULL,victim,TO_CHAR);
		act("You ignore $m.",ch,NULL,victim,TO_VICT);
		act("$N ignores $n.",ch,NULL,victim,TO_NOTVICT);
		return;
    }

    send_to_char("You scream in terror as you are Consumed with Infernal Fear!\n\r",victim);
    act("$n screams in terror as $e is Consumed with Infernal Fear.",victim,NULL,NULL,TO_ROOM);

    if ( ( sn = skill_lookup( "fear" ) ) < 0 )
    {
		send_to_char( "Bug - please note Spiral or Dominion.\n\r", ch );
		return;
    }

    af.type      = sn;
    af.location  = APPLY_HITROLL;
    af.modifier  = 0 - get_disc(ch,DISC_DAIMOINON);
    af.duration  = number_range(1,2);
    af.bitvector = AFF_FEAR;
    affect_to_char( victim, &af );

    af.location  = APPLY_DAMROLL;
    af.modifier  = 0 - get_disc(ch,DISC_DAIMOINON);
    affect_to_char( victim, &af );

    WAIT_STATE( ch, 12 );
    return;
}

void power_ghoul( CHAR_DATA *ch, CHAR_DATA *victim, char *argument )
{
	CHAR_DATA *familiar;
	char buf[MAX_STRING_LENGTH];
	
	if (!IS_NPC(victim))
	{
		send_to_char("Not on player characters\n\r",ch);
		return;
	}

	if ( ( familiar = ch->pcdata->familiar ) != NULL)
	{
		sprintf(buf,"You break your hold over %s.\n\r",familiar->short_descr->str);
		send_to_char( buf, ch );
		familiar->wizard = NULL;
		ch->pcdata->familiar = NULL;
		return;
	}
	
	if (victim->wizard != NULL)
	{
		send_to_char( "You are unable to make them a ghoul.\n\r", ch );
		return;
	}
	
	if (victim->level > (ch->spl[RED_MAGIC] * 0.25))
	{
		send_to_char( "They are too powerful.\n\r", ch );
		return;
	}
	
	ch->pcdata->familiar = victim;
	victim->wizard = ch;
	act("You cut open your wrist and feed $N some blood.",ch,NULL,victim,TO_CHAR);
	act("$n cuts open $s wrist and feeds you some blood.",ch,NULL,victim,TO_VICT);
	act("$n cuts open $s wrist and feeds $N some blood.",ch,NULL,victim,TO_NOTVICT);
	return;
}

void power_discern(CHAR_DATA *ch, CHAR_DATA *victim, char *argument)
{
    if (IS_ADDED(ch, ADDED_DISCERN))
    {
        send_to_char("The whispers stop.\n\r",ch);
        REMOVE_BIT(ch->added, ADDED_DISCERN);
    }
    else
    {
        send_to_char("You start hearing whispers.\n\r",ch);
        SET_BIT(ch->added, ADDED_DISCERN);
    }
    return;
}

void power_chameleon(CHAR_DATA *ch, CHAR_DATA *victim, char *argument)
{
    if (IS_ADDED(ch, ADDED_CHAMELEON))
    {
        send_to_char("You stop hiding and move again.\n\r",ch);
        REMOVE_BIT(ch->added, ADDED_CHAMELEON);
    }
    else
    {
        send_to_char("You stand still and hide like the chameleon.\n\r",ch);
        SET_BIT(ch->added, ADDED_CHAMELEON);
    }
    return;
}

void power_voices_of_castle(CHAR_DATA *ch, CHAR_DATA *victim, char *argument)
{
    if (IS_ADDED(ch, ADDED_VOICESOFCASTLE))
    {
        send_to_char("The Voices Stop.\n\r",ch);
        REMOVE_BIT(ch->added, ADDED_VOICESOFCASTLE);
    }
    else
    {
        send_to_char("You start hearing voices.\n\r",ch);
        SET_BIT(ch->added, ADDED_VOICESOFCASTLE);
    }
    return;
}
void power_bond_terra( CHAR_DATA *ch,CHAR_DATA *victim, char * argument )
{
	if (ch->pcdata->stats[UNI_RAGE] > 0)
	{
		send_to_char("You cannot control your melding abilities while the beast is so strong.\n\r",ch);
		return;
	}
	if ( ch->position == POS_FIGHTING )
	{
		send_to_char( "No way! You are fighting.\n\r", ch );
		return;
	}
	if ( ch->pk_timer > 0 )
	{
		send_to_char("You can't meld while still frenzied from last combat.\n\r",ch);
		return;
	}
	if ( ch->plane == PLANE_EARTH)
	{
		ch->plane = PLANE_NORMAL;
		shift_obj_plane(ch);
		act("$n reforms into thier normal stature.",ch,NULL,NULL,TO_ROOM);
		send_to_char("You reform into your normal stature.\n\r",ch);
		return;		
	}
	else
	{
		ch->plane = PLANE_NORMAL;
		shift_obj_plane(ch);
		send_to_char("You become one with the earth, as you seep into the ground.\n\r",ch);
		act("$n becomes one with the earth, as they seep into the ground.",ch,NULL,NULL,TO_ROOM);
		return;
	}

	return;
}

void power_tasteblood( CHAR_DATA *ch,CHAR_DATA *victim, char * argument )
{
    char      buf [MAX_INPUT_LENGTH];
    char      disc [40];
    int       col, sn;

    if (IS_NPC(victim) || !IS_CLASS(victim,CLASS_VAMPIRE))
    {
        send_to_char("Only on other Vampires.\n\r",ch);
        return;
    }

    act("You examine $N intently.",ch,NULL,victim,TO_CHAR);
    act("$n examines $N intently.",ch,NULL,victim,TO_NOTVICT);
    act("$n examines you intently.",ch,NULL,victim,TO_VICT);

    send_to_char( "--------------------------------------------------------------------------------\n\r", ch );
    if (IS_VAMPIRE(victim))
        {
            sprintf(buf,"Name: %-15s     Clan: %-15s     Generation: %d\n\r",
                    victim->name->str,
                    iclan_table[victim->clan].pretty_name, victim->pcdata->stats[UNI_GEN]);
            send_to_char( buf, ch );
            send_to_char( "--------------------------------------------------------------------------------\n\r", ch );
            sprintf(buf,"Blood: %-15d\n\r",
                    victim->pcdata->condition[COND_THIRST]);
            send_to_char(buf,ch);
            send_to_char( "--------------------------------------------------------------------------------\n\r", ch );
        }

        col    = 0;
        for ( sn = 0; sn <= MAX_DISC; sn++ )
        {
            if ( get_disc(victim,sn) == 0 ) continue;

            switch (sn)
            {
                default: strcpy(disc,"None"); break;
                case DISC_ANIMALISM: strcpy(disc,"Animalism"); break;
                case DISC_AUSPEX: strcpy(disc,"Auspex"); break;
                case DISC_CELERITY: strcpy(disc,"Celerity"); break;
                case DISC_CHIMERSTRY: strcpy(disc,"Chimerstry"); break;
                case DISC_DAIMOINON: strcpy(disc,"Daimoinon"); break;
                case DISC_DOMINATE: strcpy(disc,"Dominate"); break;
                case DISC_FORTITUDE: strcpy(disc,"Fortitude"); break;
                case DISC_MELPOMINEE: strcpy(disc,"Melpominee"); break;
                case DISC_NECROMANCY: strcpy(disc,"Necromancy"); break;
                case DISC_OBEAH: strcpy(disc,"Obeah"); break;
                case DISC_OBFUSCATE: strcpy(disc,"Obfuscate"); break;
                case DISC_OBTENEBRATION: strcpy(disc,"Obtenebration"); break;
                case DISC_POTENCE: strcpy(disc,"Potence"); break;
                case DISC_PRESENCE: strcpy(disc,"Presence"); break;
                case DISC_PROTEAN: strcpy(disc,"Protean"); break;
                case DISC_QUIETUS: strcpy(disc,"Quietus"); break;
                case DISC_SERPENTIS: strcpy(disc,"Serpentis"); break;
                case DISC_THANATOSIS: strcpy(disc,"Thanatosis"); break;
                case DISC_THAUMATURGY: strcpy(disc,"Thaumaturgy"); break;
                case DISC_VICISSITUDE: strcpy(disc,"Vicissitude"); break;
            }

            if ( get_disc(victim,sn) < 0 )
            {
                sprintf( buf, "%-15s: 0        ",
                         disc );
                send_to_char( buf, ch );
                if ( ++col % 3 == 0 ) send_to_char( "\n\r", ch );
            }
            else
            {
                sprintf( buf, "%-15s: %-2d       ",
                         disc, get_disc(victim,sn) );
                send_to_char( buf, ch );
                if ( ++col % 3 == 0 ) send_to_char( "\n\r", ch );
            }


            if ( col % 3 != 0 ) send_to_char( "\n\r", ch );

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

        return;
}        

void power_bloodrage( CHAR_DATA *ch, CHAR_DATA *victim, char *argument )
{
    if (IS_NPC(victim) || !IS_VAMPIRE(victim))
    {
	    send_to_char( "You can only use this power on vampires.\n\r", ch );
	    return;
    }

    act("You focus and concentrate on $N's blood.",ch,NULL,victim,TO_CHAR);
    do_regenerate(victim,"");
    
    return;
}

void power_potency( CHAR_DATA *ch, CHAR_DATA *victim, char *argument )
{
    AFFECT_DATA af;
    int sn;

    if ( ( sn = skill_lookup( "blood potency" ) ) < 0 ) return;

    if ( is_affected( victim, sn ) )
    {
	send_to_char("You are unable to concentrate the potency of your blood any further.\n\r",ch);
	return;
    }

    af.type      = sn;
    af.duration  = (get_disc(ch,DISC_THAUMATURGY) * number_range(5,10));
    af.location  = APPLY_BLOOD_MAX;
    af.modifier  = 100;
    af.bitvector = 0;
    affect_to_char( ch, &af );

    act( "A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM );
    send_to_char("You concentrate the potency of your blood.\n\r",ch);

    return;
}

void power_theftvitae( CHAR_DATA *ch, CHAR_DATA *victim, char *argument )
{
    int       blood = number_range(15,35);

    if (is_safe(ch,victim))
        return;

    if (IS_NPC(victim) || !IS_CLASS(victim,CLASS_VAMPIRE))
    {
        send_to_char("Only on other Vampires.\n\r",ch);
        return;
    }

    if (victim->pcdata->stats[UNI_BLOOD_POT] != 0)
    {
        blood *= victim->pcdata->stats[UNI_BLOOD_POT];
    }
    if ( victim->pcdata->condition[COND_THIRST] < blood )
        blood = victim->pcdata->condition[COND_THIRST];

    act("A stream of blood shoots from $N's body into yours.",ch,NULL,victim,TO_CHAR);
    act("A stream of blood shoots from your body into $n's.",ch,NULL,victim,TO_VICT);
    act("A stream of blood shoots from $N's body into $n's.",ch,NULL,victim,TO_NOTVICT);

    victim->pcdata->condition[COND_THIRST] -= blood;
    ch->pcdata->condition[COND_THIRST] += blood;
    
    if (ch->pcdata->condition[COND_THIRST] >= 100 + ch->pcdata->stats[UNI_BLOOD_MAX])
    {
        ch->pcdata->condition[COND_THIRST] = ch->pcdata->stats[UNI_BLOOD_MAX];
        if (IS_VAMPIRE(ch)) send_to_char("Your blood lust is sated.\n\r",ch);
    }
    
    if (IS_VAMPIRE(victim))
    {
        if (victim->pcdata->condition[COND_THIRST] > 0 && victim->pcdata->condition[COND_THIRST] <= 50)
        {
            act("$n sways weakly from bloodloss.",victim,NULL,NULL,TO_ROOM);
            send_to_char("You feel weak from bloodloss.\n\r",victim);
        }
    }
    
    if (IS_NPC(victim)) 
        do_kill(victim,ch->name->str);
    return;
}

void power_cauldronblood( CHAR_DATA *ch, CHAR_DATA *victim, char *argument )
{
    int       blood = number_range(10,20);
    int       damage;

    if (is_tempsafe(ch)) return;
    

    if (IS_NPC(victim) || !IS_CLASS(victim,CLASS_VAMPIRE))
    {
        send_to_char("Only on other Vampires.\n\r",ch);
        return;
    }

    if(victim->position < POS_SLEEPING)
    {
        send_to_char("Nope, not gonna work.\n\r",ch);
        return;
    }

    if ( victim->pcdata->condition[COND_THIRST] < blood )
	blood = victim->pcdata->condition[COND_THIRST];
    damage = (blood * number_range(1,5));
    if ( !IS_NPC(victim) && get_disc(victim,DISC_FORTITUDE) > 0)
    {
	int per_red = 0;
	switch( get_disc(victim,DISC_FORTITUDE) )
	{
	    default: per_red = 0;                   break;
	    case 1:  per_red = number_range(5,10);  break;
	    case 2:  per_red = number_range(10,20); break;
	    case 3:  per_red = number_range(15,30); break;
	    case 4:  per_red = number_range(20,40); break;
	    case 5:  per_red = number_range(25,50); break;
	    case 6:  per_red = number_range(30,60); break;
	    case 7:  per_red = number_range(35,70); break;
	    case 8:  per_red = number_range(40,80); break;
	    case 9:  per_red = number_range(45,90); break;
	    case 10: per_red = number_range(50,100);break;
	}
	damage -= (damage * (int)((double)per_red * 0.01));
    }

    act( "A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM );

    send_to_char("You scream in agony as your blood begins to boil!\n\r",victim);
    act("$n screams in agony as $s blood begins to boil!",victim,NULL,NULL,TO_ROOM);

    if (!IS_NPC(ch) && get_disc(victim,DISC_DAIMOINON) < 4)
	{
            victim->hit -= damage;
            victim->pcdata->condition[COND_THIRST] -= blood;
    }
    
    if(ch->fighting == NULL)
        set_fighting(ch,victim);
    
    add_agony(victim);
    update_pos(victim);
	return;
}

void power_panacea( CHAR_DATA *ch, CHAR_DATA *victim, char *argument )
{
    char      buf [MAX_STRING_LENGTH];
    AFFECT_DATA *paf;

    if (ch->pcdata->obeah > 0)
    {
	if (ch->pcdata->obeah > 1)
	    sprintf(buf,"You cannot call upon your Obeah powers for another %d seconds.\n\r",ch->pcdata->obeah);
	else
	    sprintf(buf,"You cannot call upon your Obeah powers for another 1 second.\n\r");
	send_to_char(buf,ch);
	return;
    }

    if (IS_EVIL(victim))
    {
	send_to_char( "They are too evil to benefit from the powers of Obeah.\n\r", ch );
	return;
    }

    if (victim->loc_hp[6] > 0)
    {
	int sn = skill_lookup( "clot" );
	act( "$n's third eye begins to glow with an intense white light.", ch, NULL, NULL, TO_ROOM );
	send_to_char( "Your third eye begins to glow with an intense white light.\n\r", ch );
	ch->pcdata->obeah = 5;
	(*skill_table[sn].spell_fun) (sn,ch->level,ch,victim);
    }
    else
    {
	if ((victim->loc_hp[0] + victim->loc_hp[1] + victim->loc_hp[2] +
	    victim->loc_hp[3] + victim->loc_hp[4] + victim->loc_hp[5]) != 0)
	{
	    act( "$n's third eye begins to glow with an intense white light.", ch, NULL, NULL, TO_ROOM );
	    send_to_char( "Your third eye begins to glow with an intense white light.\n\r", ch );
	    ch->pcdata->obeah = 10;
	    reg_mend(victim);
	}
	else if (victim->hit < victim->max_hit)
	{
	    victim->hit += get_disc(ch, DISC_OBEAH) * 1000;
	    if (IS_AFFECTED(ch,AFF_AGGDAM))
		{
			if 	((paf = find_affect(ch,AFF_AGGDAM)) != NULL)
				affect_remove(ch, paf);
		}
        act( "$n's third eye begins to glow with an intense white light.", ch, NULL, NULL, TO_ROOM );
	    send_to_char( "Your third eye begins to glow with an intense white light.\n\r", ch );
	    ch->pcdata->obeah = 30;
	    update_pos(victim);
	    if (victim->hit >= victim->max_hit)
	    {
		victim->hit = victim->max_hit;
		send_to_char("You have been completely healed!\n\r",victim);
		act("$n's wounds have been completely healed!",victim,NULL,NULL,TO_ROOM);
	    }
	    else
	    {
		send_to_char("Your wounds begin to heal!\n\r",victim);
		act("$n's wounds begin to heal!",victim,NULL,NULL,TO_ROOM);
	    }
	}
	else
	{
	    send_to_char("They don't require any healing.\n\r",ch);
	    return;
	}
    }
    return;
}

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

    if (ch->pcdata->obeah > 0)
    {
	if (ch->pcdata->obeah > 1)
	    sprintf(buf,"You cannot call upon your Obeah powers for another %d seconds.\n\r",ch->pcdata->obeah);
	else
	    sprintf(buf,"You cannot call upon your Obeah powers for another 1 second.\n\r");
	send_to_char(buf,ch);
	return;
    }

    if (IS_EVIL(victim))
    {
	send_to_char( "They are too evil to benefit from the powers of Obeah.\n\r", ch );
	return;
    }

    act( "$n's third eye begins to glow with an intense white light.", ch, NULL, NULL, TO_ROOM );
    send_to_char( "Your third eye begins to glow with an intense white light.\n\r", ch );
    ch->pcdata->obeah = 30;

    return;
}

void power_neutral( CHAR_DATA *ch, CHAR_DATA *victim, char *argument )
{
    char buf [MAX_INPUT_LENGTH];
    CHAR_DATA *rch;

    if (IS_NPC(ch)) return;

    if (ch->pcdata->obeah > 0 && !IS_ADDED(ch, ADDED_NEUTRAL))
    {
	if (ch->pcdata->obeah > 1)
	    sprintf(buf,"You cannot call upon your Obeah powers for another %d seconds.\n\r",ch->pcdata->obeah);
	else
	    sprintf(buf,"You cannot call upon your Obeah powers for another 1 second.\n\r");
	send_to_char(buf,ch);
	return;
    }

    if (ch->in_room == NULL)
    {
	send_to_char("Nothing happens.\n\r",ch);
	return;
    }

    if (IS_ADDED(ch, ADDED_NEUTRAL))
    {
	REMOVE_BIT(ch->added, ADDED_NEUTRAL);
	REMOVE_BIT(ch->in_room->room_flags, ROOM_SAFE);
	act("A look of concentration crosses $n's face.", 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 (IS_SET(ch->in_room->room_flags, ROOM_SAFE))
    {
	send_to_char("You are unable to create a Neutral Guard here.\n\r", ch);
	return;
    }

    SET_BIT(ch->in_room->room_flags, ROOM_SAFE);
    SET_BIT(ch->added, ADDED_NEUTRAL);
    act( "$n's third eye begins to glow with an intense white light.", ch, NULL, NULL, TO_ROOM );
    send_to_char( "Your third eye begins to glow with an intense white light.\n\r", ch );
    ch->pcdata->obeah = 30;
    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;
}

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

    if (ch->pcdata->obeah > 0)
    {
	if (ch->pcdata->obeah > 1)
	    sprintf(buf,"You cannot call upon your Obeah powers for another %d seconds.\n\r",ch->pcdata->obeah);
	else
	    sprintf(buf,"You cannot call upon your Obeah powers for another 1 second.\n\r");
	send_to_char(buf,ch);
	return;
    }

    if (!IS_VAMPIRE(victim))
    {
	send_to_char( "You can only Unburden the Soul of a Kindred.\n\r", ch );
	return;
    }

    if (!IS_IMMUNE(victim,IMM_VAMPIRE))
    {
	send_to_char( "They must lower their defences before you can try to Unburden their Soul.\n\r", ch );
	return;
    }

    if (victim->position > POS_RESTING)
    {
	send_to_char( "You better get them to sit down first.\n\r", ch );
	return;
    }

    if (victim->beast == 100)
    {
	send_to_char( "Their Soul is too Bestial to Unburden.\n\r", ch );
	return;
    }

    if (IS_EVIL(victim))
    {
	send_to_char( "They are too evil to benefit from the powers of Obeah.\n\r", ch );
	return;
    }

    act( "You place your hands against $N's chest.", ch, NULL, victim, TO_CHAR );
    act( "$n places $s hands against your chest.", ch, NULL, victim, TO_VICT );
    act( "$n places $s hands against $N's chest.", ch, NULL, victim, TO_NOTVICT );
    if (victim->beast > 1)
    {
	act( "$n's third eye begins to glow with an intense white light.", ch, NULL, NULL, TO_ROOM );
	send_to_char( "Your third eye begins to glow with an intense white light.\n\r", ch );
	victim->beast -= get_disc(ch, DISC_OBEAH);
	if ( victim->beast < 1 ) victim->beast = 1;
	ch->pcdata->obeah = 30;
	send_to_char("You feel their beast weaken it's grip!\n\r",ch);
	send_to_char("You feel your beast weaken it's grip!\n\r",victim);
    }
    else
    {
	send_to_char("You are unable to help them any further.\n\r",ch);
	return;
    }
    send_to_char("Your hands drop to your sides.\n\r",ch);
    act( "$n's hands drop to $s sides.", ch, NULL, NULL, TO_ROOM );
    return;
}

void power_renew( CHAR_DATA *ch, CHAR_DATA *victim, char *argument )
{
    char      buf [MAX_STRING_LENGTH];
    int       sn, check, oldcheck;
    AFFECT_DATA *paf;

    if (ch->position == POS_FIGHTING)
    {
	send_to_char("No way!  You are still fighting!\n\r",ch);
	return;
    }

    if (ch->pcdata->obeah > 0)
    {
	if (ch->pcdata->obeah > 1)
	    sprintf(buf,"You cannot call upon your Obeah powers for another %d seconds.\n\r",ch->pcdata->obeah);
	else
	    sprintf(buf,"You cannot call upon your Obeah powers for another 1 second.\n\r");
	send_to_char(buf,ch);
	return;
    }

    if (IS_EVIL(victim))
    {
	send_to_char( "They are too evil to benefit from the powers of Obeah.\n\r", ch );
	return;
    }

    if ((victim->loc_hp[0] + victim->loc_hp[1] + victim->loc_hp[2] + 
	 victim->loc_hp[3] + victim->loc_hp[4] + victim->loc_hp[5] + 
	 victim->loc_hp[6]) == 0 && victim->hit == victim->max_hit)
    {
	send_to_char("They don't require any healing.\n\r",ch);
	return;
    }

    act( "$n's third eye begins to glow with an intense white light.", ch, NULL, NULL, TO_ROOM );
    send_to_char( "Your third eye begins to glow with an intense white light.\n\r", ch );
    ch->pcdata->obeah = 60;

    if ( (check = victim->loc_hp[6]) > 0)
    {
	oldcheck = 0;
	sn = skill_lookup( "clot" );
	while ( oldcheck != (check = victim->loc_hp[6]) )
	{
	    oldcheck = check;
	    (*skill_table[sn].spell_fun) (sn,ch->level,ch,victim);
	}
    }
    if ((check = (victim->loc_hp[0] + victim->loc_hp[1] + victim->loc_hp[2] +
	victim->loc_hp[3] + victim->loc_hp[4] + victim->loc_hp[5])) > 0)
    {
	oldcheck = 0;
	while ( oldcheck != (check = victim->loc_hp[0] + victim->loc_hp[1] + 
		victim->loc_hp[2] + victim->loc_hp[3] + victim->loc_hp[4] + 
		victim->loc_hp[5]) )
	{
	    oldcheck = check;
	    reg_mend(victim);
	}
    }
    if (victim->hit < victim->max_hit)
    {
	victim->hit = victim->max_hit;
	if (IS_AFFECTED(ch,AFF_AGGDAM))
		{
			if 	((paf = find_affect(ch,AFF_AGGDAM)) != NULL)
				affect_remove(ch, paf);
		}
    send_to_char("You have been completely healed!\n\r",victim);
	act("$n's wounds have been completely healed!",victim,NULL,NULL,TO_ROOM);
	update_pos(victim);
    }
    return;
}

void power_ash_to_ash( CHAR_DATA *ch, CHAR_DATA *victim, char *argument )
{
	OBJ_DATA *obj;
	int object_num;

	if (ch->pcdata->stats[UNI_RAGE] > 0)
	{
		send_to_char("You cannot control your melding abilities while the beast is so strong.\n\r",ch);
		return;
	}

	if ( ch->position == POS_FIGHTING )
	{
		send_to_char( "No way! You are fighting.\n\r", ch );
		return;
	}

	if ( ch->pk_timer > 0 )
	{
		send_to_char("You can't meld while still frenzied from last combat.\n\r",ch);
		return;
	}

	if (IS_AFFECTED(ch,AFF_POLYMORPH))
	{
		if ( ( obj = ch->pcdata->chobj ) == NULL )
		{
			send_to_char("You are already in human form.\n\r",ch);
			return;
		}
		ch->pcdata->obj_vnum = 0;
		obj->chobj = NULL;
		ch->pcdata->chobj = NULL;
		REMOVE_BIT(ch->affected_by, AFF_POLYMORPH);
		REMOVE_BIT(ch->extra, EXTRA_OSWITCH);
		ch->morph = g_string_assign(ch->morph,"");
		act("$p transforms into $n.",ch,obj,NULL,TO_ROOM);
		act("Your reform your human body.",ch,obj,NULL,TO_CHAR);
		extract_obj(obj);
		return;	
	}

	object_num = OBJ_VNUM_SPILT_BLOOD;

	if (IS_AFFECTED(ch,AFF_POLYMORPH))
	{
		send_to_char("Your cannot change in to something else!\n\r",ch);
		return;	
	}

	if ((obj = create_object(get_obj_index(object_num),ch->level)) == NULL)
	{
		send_to_char( "You don't have the ability to change into a object.\n\r", ch);
		return;
	}

	if (strcmp(argument,"blood"))
	{
		obj->short_descr = g_string_assign(obj->short_descr,"ashes");
		obj->name = g_string_assign(obj->name,"ashes");
		obj->description = g_string_assign(obj->description,"a pile of ashes lies here.");
	}

	if (IS_AFFECTED(ch,AFF_WEBBED))
	{
		send_to_char( "Not with all this sticky webbing on.\n\r", ch);
		return;
	}
	obj_to_room(obj,ch->in_room);
	act("$n transforms into $p and falls to the ground.",ch,obj,NULL,TO_ROOM);
	act("You transform into $p and fall to the ground.",ch,obj,NULL,TO_CHAR);
	ch->pcdata->obj_vnum = object_num;
	obj->chobj = ch;
	ch->pcdata->chobj = obj;
	SET_BIT(ch->affected_by, AFF_POLYMORPH);
	SET_BIT(ch->extra, EXTRA_OSWITCH);
	ch->morph = g_string_assign(ch->morph,obj->short_descr->str);
	return;
}