lurf/area/
lurf/build/testing/
lurf/log/
lurf/player/
lurf/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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <merc.h>
#include <interp.h>
#include <fight.h>
#include <tables.h>
#include <power.h>

/*
 * Local functions.
 */

void	adv_spell_damage	args( ( CHAR_DATA *ch, OBJ_DATA *book, 
	OBJ_DATA *page, char *argument) );
void	adv_spell_affect	args( ( CHAR_DATA *ch, OBJ_DATA *book, 
	OBJ_DATA *page, char *argument) );
void	adv_spell_action	args( ( CHAR_DATA *ch, OBJ_DATA *book, 
	OBJ_DATA *page, char *argument) );
void	birth_write		args( ( CHAR_DATA *ch, char *argument ) );
bool	birth_ok		args( ( CHAR_DATA *ch, char *argument ) );

/*
 * External functions.
 */
bool    check_dumbshit  args( (char *command) );
void	set_fighting	args( ( CHAR_DATA *ch, CHAR_DATA *victim ) );
void	check_killer	args( ( CHAR_DATA *ch, CHAR_DATA *victim ) );
extern int sphere_lookup args((char * sphere));
extern int sphere_count args((CHAR_DATA *ch));
extern int count_snoopers args(( DESCRIPTOR_DATA *ch ));

/* Need to get rid of those flames somehow - KaVir */
void do_smother( CHAR_DATA *ch, char *argument )
{
	CHAR_DATA *victim;
	char arg[MAX_INPUT_LENGTH];
	
	one_argument( argument, arg );
	if (IS_NPC( ch )) return;
	
	if ( arg[0] == '\0' )
	{
		send_to_char( "Smother whom?\n\r", ch );
		return;
	}
	
	if ( ( victim = get_char_room( ch, arg ) ) == NULL )
	{
		send_to_char( "They aren't here.\n\r", ch );
		return;
	}
	
	if ( ch == victim )
	{
		send_to_char( "You cannot smother yourself.\n\r", ch );
		return;
	}
	
	if (!IS_AFFECTED(victim, AFF_FLAMING))
	{
		send_to_char( "But they are not on fire!\n\r", ch );
		return;
	}
	
	if ( number_percent() > (ch->level*2) )
	{
		act( "You try to smother the flames around $N but fail!",  ch, NULL, victim, TO_CHAR    );
		act( "$n tries to smother the flames around you but fails!", ch, NULL, victim, TO_VICT    );
		act( "$n tries to smother the flames around $N but fails!",  ch, NULL, victim, TO_NOTVICT );
		if ( number_percent() > 98 && !IS_AFFECTED(ch,AFF_FLAMING) )
		{
			act( "A spark of flame from $N's body sets you on fire!",  ch, NULL, victim, TO_CHAR    );
			act( "A spark of flame from your body sets $n on fire!", ch, NULL, victim, TO_VICT    );
			act( "A spark of flame from $N's body sets $n on fire!",  ch, NULL, victim, TO_NOTVICT );
			SET_BIT(ch->affected_by, AFF_FLAMING);
			do_humanity(ch,"");
		}
		return;
	}
	
	act( "You manage to smother the flames around $M!",  ch, NULL, victim, TO_CHAR    );
	act( "$n manages to smother the flames around you!", ch, NULL, victim, TO_VICT    );
	act( "$n manages to smother the flames around $N!",  ch, NULL, victim, TO_NOTVICT );
	REMOVE_BIT(victim->affected_by, AFF_FLAMING);
	do_humanity(ch,"");
	return;
}

/* Loads of Vampire powers follow.  KaVir */

void power_fangs( CHAR_DATA *ch, CHAR_DATA *victim, char *argument )
{
   if (IS_VAMPAFF(ch,VAM_FANGS) )
	{
		send_to_char("Your fangs slide back into your gums.\n\r",ch);
		act("$n's fangs slide back into $s gums.", ch, NULL, NULL, TO_ROOM);
		REMOVE_BIT(ch->pcdata->stats[UNI_AFF], VAM_FANGS);
		return;
	}
	send_to_char("Your fangs extend out of your gums.\n\r",ch);
	act("A pair of razor sharp fangs extend from $n's mouth.", ch, NULL, NULL, TO_ROOM);
	SET_BIT(ch->pcdata->stats[UNI_AFF], VAM_FANGS);
	return;
}

void do_shift( CHAR_DATA *ch, char *argument )
{
	char arg [MAX_INPUT_LENGTH];
	int  toform = 0;
	
	argument = one_argument( argument, arg );
	
	if (IS_NPC(ch)) return;
	
	if (!IS_CLASS(ch, CLASS_WEREWOLF))
	{
		send_to_char("Huh?\n\r",ch);
		return;
	}
	
	if ( arg[0] == '\0' )
	{
		send_to_char( "You can shift between the following forms: Homid, Glabro, Crinos, Hispo, Lupus.\n\r", ch );
		return;
	}
	if      ( !str_cmp(arg,"homid" ) ) toform = 1;
	else if ( !str_cmp(arg,"glabro") ) toform = 2;
	else if ( !str_cmp(arg,"crinos") ) toform = 3;
	else if ( !str_cmp(arg,"hispo" ) ) toform = 4;
	else if ( !str_cmp(arg,"lupus" ) ) toform = 5;
	else
	{
		send_to_char( "You can shift between the following forms: Homid, Glabro, Crinos, Hispo, Lupus.\n\r", ch );
		return;
	}
	if ( ch->pcdata->stats[UNI_FORM0] < 1 || ch->pcdata->stats[UNI_FORM0] > 5) 
		ch->pcdata->stats[UNI_FORM0] = 1;
	if ( ch->pcdata->stats[UNI_FORM0] == toform )
	{
		send_to_char( "You are already in that form.\n\r", ch );
		return;
	}
	ch->pcdata->stats[UNI_FORM1] = toform;
	return;
}

void power_claws( CHAR_DATA *ch, CHAR_DATA *victim, char *argument )
{
	if (IS_VAMPAFF(ch,VAM_CLAWS) )
	{
		if (IS_CLASS(ch, CLASS_VAMPIRE)) 
		{
			send_to_char("Your claws slide back under your nails.\n\r",ch);
			act("$n's claws slide back under $s nails.", ch, NULL, NULL, TO_ROOM);
		}
		else
		{
			send_to_char("Your talons slide back into your fingers.\n\r",ch);
			act("$n's talons slide back into $s fingers.",ch,NULL,NULL,TO_ROOM);
		}
		REMOVE_BIT(ch->pcdata->stats[UNI_AFF], VAM_CLAWS);
		return;
	}
	
	if (IS_CLASS(ch, CLASS_VAMPIRE)) 
	{
		send_to_char("Sharp claws extend from under your finger nails.\n\r",ch);
		act("Sharp claws extend from under $n's finger nails.", ch, NULL, NULL, TO_ROOM);
	}
	else
	{
		send_to_char("Razor sharp talons extend from your fingers.\n\r",ch);
		act("Razor sharp talons extend from $n's fingers.",ch,NULL,NULL,TO_ROOM);
	}
	SET_BIT(ch->pcdata->stats[UNI_AFF], VAM_CLAWS);
	return;
}


void do_anarch( CHAR_DATA *ch, char *argument )
{
	char      arg [MAX_INPUT_LENGTH];
	char      buf [MAX_INPUT_LENGTH];
	
	argument = one_argument( argument, arg );
	
	if (IS_NPC(ch)) return;
	
	if (IS_CLASS(ch, CLASS_VAMPIRE) )
	{
		send_to_char("Huh?\n\r",ch);
		return;
	}
	
	if (!IS_CLASS(ch, CLASS_VAMPIRE) )
	{
		send_to_char("Huh?\n\r",ch);
		return;
	}
	
	if (ch->clan > CLAN_NONE)
	{
		send_to_char("But you are already in a clan!\n\r",ch);
		return;
	}
	
	if (IS_SET(ch->special, SPC_INCONNU))
	{
		send_to_char("But you are already an Inconnu!\n\r",ch);
		return;
	}
	
	if ( IS_SET(ch->special, SPC_ANARCH) )
	{
		send_to_char("You are no longer an Anarch.\n\r",ch);
		sprintf(buf,"%s is no longer an Anarch!",ch->name->str);
		do_info(ch,buf);
		REMOVE_BIT(ch->special, SPC_ANARCH);
		return;
	}
	send_to_char("You are now an Anarch.\n\r",ch);
	sprintf(buf,"%s is now an Anarch!",ch->name->str);
	do_info(ch,buf);
	SET_BIT(ch->special, SPC_ANARCH);
	return;
}

void do_inconnu( CHAR_DATA *ch, char *argument )
{
	char      arg [MAX_INPUT_LENGTH];
	char      buf [MAX_INPUT_LENGTH];
	
	argument = one_argument( argument, arg );
	
	if (IS_NPC(ch)) return;
	
	if (IS_CLASS(ch, CLASS_VAMPIRE) )
	{
		send_to_char("Huh?\n\r",ch);
		return;
	}
	
	if (!IS_CLASS(ch, CLASS_VAMPIRE) )
	{
		send_to_char("Huh?\n\r",ch);
		return;
	}
	
	if (ch->clan > CLAN_NONE && ch->pcdata->stats[UNI_GEN] < 3)
	{
		send_to_char("You cannot abandon your clan!\n\r",ch);
		return;
	}
	
	if (years_old(ch) < 75 && ch->pcdata->stats[UNI_GEN] > 2)
	{
		send_to_char("You must be at least an Elder to become an Inconnu.\n\r",ch);
		return;
	}
	
	if (IS_SET(ch->special, SPC_INCONNU))
	{
		send_to_char("But you are already an Inconnu!\n\r",ch);
		return;
	}
	
	if (ch->exp < 1000000)
	{
		send_to_char("It costs 1000000 exp to become an Inconnu.\n\r",ch);
		return;
	}
	
	if (IS_SET(ch->special, SPC_ANARCH)) REMOVE_BIT(ch->special, SPC_ANARCH);
	ch->clan = CLAN_NONE;
	ch->exp -= 1000000;
	send_to_char("You are now an Inconnu.\n\r",ch);
	sprintf(buf,"%s is now an Inconnu!",ch->name->str);
	do_info(ch,buf);
	SET_BIT(ch->special, SPC_INCONNU);
	return;
}


void do_bite( CHAR_DATA *ch, char *argument )
{
	CHAR_DATA *victim;
	char      arg1 [MAX_INPUT_LENGTH];
	char      arg2 [MAX_INPUT_LENGTH];
	char      buf [MAX_INPUT_LENGTH];
	int       clancount;
	sh_int    count;
	sh_int    clan = -1;
	bool      can_sire = FALSE;
	bool      outcast = FALSE;
	
	argument = one_argument( argument, arg1);
	argument = one_argument( argument, arg2);
	
	if (IS_NPC(ch)) return;
	
	if (!strcmp(ch->name->str,"Halbarad"))
	{
		send_to_char("You are a CAITIFF, dumbass!  You get NO childe!\n\r",ch);
		return;
	}
	
	if (!IS_CLASS(ch, CLASS_VAMPIRE) && !IS_IMMORTAL(ch))
	{
		send_to_char("Huh?\n\r",ch);
		return;
	}
    
    if (IS_IMMORTAL(ch) && ch->level < LEVEL_JUDGE) 
    {
    	send_to_char("Huh?\n\r",ch);
		return;
    }

	if (ch->pcdata->stats[UNI_CURRENT] == -1) 
		ch->pcdata->stats[UNI_CURRENT] = ch->pcdata->stats[UNI_AFF]; 
	

    //if (IS_SET(ch->special,SPC_PRINCE)) can_sire = TRUE;
    

    //if (ch->pcdata->stats[UNI_GEN] < 3 || ch->pcdata->stats[UNI_GEN] > 6) can_sire = FALSE;

	if (ch->pcdata->stats[UNI_GEN] > 12) 
		can_sire = FALSE;  // was 6
	else 
		can_sire = TRUE;
	
	if (!can_sire && !IS_IMMORTAL(ch))
	{
		send_to_char("You are not able to create any childer.\n\r",ch);
		return;
	}
	
	if (ch->clan == CLAN_NONE && ch->pcdata->stats[UNI_GEN] == 2 && !IS_IMMORTAL(ch))
	{
		send_to_char( "First you need to found a clan.\n\r", ch );
		return;
	}
	
	clancount = 0;
	
	for ( count = 0 ; count < MAX_DISC ; count++ )
	{
		if ( IS_VAMPPASS(ch,count) ) 
			clancount++;
	}
	
	if ( clancount < 3  && !IS_IMMORTAL(ch))
	{
		send_to_char( "First you need to master 3 disciplines.\n\r", ch );
		return;
	}
	
	if ( arg1[0] == '\0' )
	{
		send_to_char( "Bite whom?\n\r", ch );
		return;
	}
	
	
	if ( ( victim = get_char_room( ch, arg1 ) ) == NULL )
	{
		send_to_char( "They aren't here.\n\r", ch );
		return;
	}
	
	if ( IS_NPC(victim) )
	{
		send_to_char( "Not on NPC's.\n\r", ch );
		return;
	}
	
	if ( ch == victim )
	{
		send_to_char( "You cannot bite yourself.\n\r", ch );
		return;
	}
	
	if (IS_CLASS(victim, CLASS_MAGE))
	{
		send_to_char( "You cannot bite mages.\n\r", ch );
		return;
	}
	
	if (IS_CLASS(victim, CLASS_WEREWOLF))
	{
		send_to_char( "You are unable to create werevamps!\n\r", ch );
		return;
	}
	
	if (IS_CLASS(victim, CLASS_VAMPIRE) && ch->beast != 100)
	{
		send_to_char( "But they are already a vampire!\n\r", ch );
		return;
	}
	
	if (IS_SWWF(victim))
	{
		send_to_char("Do I really have to tell you that you can't do this?\n\r",ch);
		return;
	}

	if (IS_CLASS(victim, CLASS_WRAITH))
	{
		send_to_char( "You cannot turn wraiths into vampires.\n\r", ch );
		return;
	}
	
	if (IS_IMMUNE(victim,IMM_VAMPIRE) && ch->beast != 100)
	{
		send_to_char( "You cannot bite an unwilling person.\n\r", ch );
		return;
	}
	
	if (!IS_VAMPAFF(ch,VAM_FANGS) && ch->beast != 100 && !IS_IMMORTAL(ch))
	{
		send_to_char("First you better get your fangs out!\n\r",ch);
		return;
	}
	
	if (IS_VAMPAFF(ch,VAM_DISGUISED) && ch->beast != 100 && !IS_IMMORTAL(ch))
	{
		send_to_char("You must reveal your true nature to bite someone.\n\r",ch);
		return;
	}
	
	if (!IS_IMMORTAL(ch))
	{
		if (ch->clan == CLAN_NONE && ch->level < 4 )
		{
			send_to_char("You cannot create any childe.\n\r",ch);
			return;
		}
		if (ch->exp < 1000000 && ch->beast != 100)
		{
			send_to_char("You cannot afford the 1000000 exp to create a childe.\n\r",ch);
			return;
		}

		if (HAS_DELAY(victim) || HAS_DELAY(ch))
		{
			send_to_char( "Not with a wait timer...\n\r", ch );
			return;
		}

		for ( count = 0 ; count < MAX_DISC; count++ )
		{
			if ( get_disc(victim,count) > 0 || IS_VAMPPASS(victim,count) )
			{
				send_to_char("You have no inherited discs.\n\r",ch);
				return;          
			}
		}
	}
	
	if ( IS_IMMORTAL(ch) )
	{
		if ( arg2[0] == '\0' )
		{
			send_to_char("Usage: bite <player> <clan|'random'>\n\r",ch);
			return;
		}
		
		if ( (clan = vamp_clan_lookup(arg2)) == -1)
		{
			if (!str_cmp(arg2,"random"))
				clan = number_range(0,MAX_VAMP_CLAN - 1);
			else
			{
				send_to_char("Usage: bite <player> <clan|'random'>\n\r",ch);
				return;
			}
		}
	}    
	
	if (ch->beast == 100 || ch->pcdata->stats[UNI_RAGE] > 0)
	{
		if (!IS_VAMPAFF(ch,VAM_FANGS) ) power_fangs(ch,ch,argument);
		act("Your jaw opens wide and you leap hungrily at $N.", ch, NULL, victim, TO_CHAR);
		act("$n's jaw opens wide and $e leaps hungrily at $N.", ch, NULL, victim, TO_NOTVICT);
		act("$n's jaw opens wide and $e leaps hungrily at you.", ch, NULL, victim, TO_VICT);
		one_hit( ch, victim, -1, 0 );
		return;
	}

/*  if (ch->beast > 0)
	ch->beast += 1;  */
	ch->exp = ch->exp - 1000000;
	//act("You sink your teeth into $N.", ch, NULL, victim, TO_CHAR);
	act("$n sinks $s teeth into $N.", ch, NULL, victim, TO_NOTVICT);
	act("$n sinks $s teeth into your neck.", ch, NULL, victim, TO_VICT);

       send_to_char( "You sink your fangs into your helpless victim.\n\r", ch );
       send_to_char( "Then, in the final death throes, you bite your own arm.\n\r", ch );
       send_to_char( "You allow your blood to drip into their mouth, damning them to Eternal Night!\n\r", ch );
       send_to_char( "You feel some of your essential blood potential drain into your victim!\n\r", ch );

       send_to_char( "You feel your soul ripped asunder as your lifeblood is drawn away!!\n\r", victim );
       send_to_char( "Your last breath escapes you, and you begin to submit to death itself.\n\r", victim );
       send_to_char( "You suddenly feel a hot, coppery tasting fluid enter your mouth.\n\r",victim); 
       send_to_char( "The strength of the Kindred begins to fill your veins.\n\r", victim );
       send_to_char( "Your mind is flooded with the sudden knowledge of damnation and Eternal Night!\n\r", victim );
       send_to_char( "Awakening to a new knowledge of your status as a Chosen, you know that upon your\n\r", victim );
       send_to_char( "first taste of mortal blood, you shall forever enter the ranks of the Kindred!\n\r", victim );

	victim->creature=CLASS_VAMPIRE;
	
	if ( victim->pcdata->stats[UNI_GEN] != 0 )
	{
		if (IS_SET(ch->special,SPC_SIRE))
			REMOVE_BIT(ch->special,SPC_SIRE);
		if (IS_SET(ch->special, SPC_ANARCH) && ch->clan == CLAN_NONE)
			outcast = TRUE;
	}
	else outcast = FALSE;
		send_to_char( "\n\rYou are now a vampire.\n\r", victim );    

        /* AutoSect Code by Spiral */
	if (IS_IMMORTAL(ch))
		victim->sect = SECT_INDEPENDENT;
	else
		victim->sect = ch->sect;
	
	victim->pcdata->stats[UNI_GEN] = (IS_IMMORTAL(ch) ? 4 : ch->pcdata->stats[UNI_GEN] + 1);
/*
    clan_table_bite(victim);
*/
	
	if ( clan != -1 )
	{
		victim->lord = g_string_assign(victim->lord,vamp_clan_table[clan].lineage);
	}
	else if (ch->pcdata->stats[UNI_GEN] == 1)
		victim->lord = g_string_assign(victim->lord,ch->name->str);
	else
	{
		sprintf(buf,"%s %s",ch->lord->str,ch->name->str);
		victim->lord = g_string_assign(victim->lord,buf);
	}
	
	if ( clan != -1 )
	{
		if (victim->pcdata->stats[UNI_CURRENT] == -1) 
		{
			for ( count = 0 ; count < MAX_DISC; count++ )
			{
				if ( get_disc(victim,count) < 0 )
					victim->pcdata->Ninherited[count] = 1;
			}
		}
		
		for ( count = 0 ; count < 3; count++ )
		{
			victim->pcdata->Ninherited[vamp_clan_table[clan].discipline[count]] = 1;
			victim->pcdata->disc[vamp_clan_table[clan].discipline[count]] = 1;
		}
		
		victim->clan = vamp_clan_table[clan].iclan_number;
		
  	}
	else if (ch->pcdata->stats[UNI_GEN] != 1)
	{
		if (victim->pcdata->stats[UNI_CURRENT] == -1) 
		{
			for ( count = 0 ; count < MAX_DISC; count++ )
			{
				if ( get_disc(victim,count) < 0 )
					victim->pcdata->Ninherited[count] = 1;
			}
		}
		
	/* Remove any old powers they might have */
		for ( count = 0 ; count < MAX_DISC; count++ )
		{
			victim->pcdata->disc[count] = 0;
		}
		
		if (!outcast)
		{
			victim->clan= ch->clan;
		}
		
	/* Give the vampire the base powers of their sire */
		for ( count = 0 ; count < MAX_DISC; count++ )
		{
			if ( ch->pcdata->Ninherited[count] )
			{
				victim->pcdata->Ninherited[count] = 1;
				victim->pcdata->disc[count] = 1;
			}
		}
	}
	save_char_obj(ch);
	save_char_obj(victim);
	return;
}

void do_claw( CHAR_DATA *ch, char *argument )
{
	CHAR_DATA *victim;
	char      arg [MAX_INPUT_LENGTH];
	char      buf [MAX_INPUT_LENGTH];
	bool      can_sire = FALSE;
	
	argument = one_argument( argument, arg );
	
	if (IS_NPC(ch)) return;

	if (!IS_CLASS(ch, CLASS_SWWF) && !IS_IMMORTAL(ch))
	{
		power_claws(ch,ch,argument);
		return;
	}
	
    if (IS_IMMORTAL(ch) && ch->level <= LEVEL_HIGHJUDGE) 
    {
    	send_to_char("Huh?\n\r",ch);
		return;
    }

    if (IS_SET(ch->special, SPC_BETA)
        ||  IS_SET(ch->special, SPC_PRINCE)) can_sire = TRUE;
	else can_sire = FALSE;

	
	if (!can_sire)
	{
		send_to_char("You are unable to spread your gift.\n\r",ch);
		return;
	}
	
	if (ch->pcdata->stats[UNI_GEN] == 1 && ch->pcdata->stats[UNI_AFF] >= 4 && !IS_IMMORTAL(ch))
	{
		send_to_char("You have already created 4 tribal leaders.\n\r",ch);
		return;
	}
/*
    else if (ch->pcdata->stats[UNI_GEN] != 1 && ch->pcdata->stats[UNI_AFF] >= 2)
    {
	send_to_char("You have already created 2 pups.\n\r",ch);
	return;
    }
*/
	if (ch->clan == CLAN_NONE && ch->pcdata->stats[UNI_GEN] != 1 )
	{
		send_to_char( "First you need to create a tribe.\n\r", ch );
		return;
	}
	
	if ( arg[0] == '\0' )
	{
		send_to_char( "Claw whom?\n\r", ch );
		return;
	}
	
	if ( ( victim = get_char_room( ch, arg ) ) == NULL )
	{
		send_to_char( "They aren't here.\n\r", ch );
		return;
	}
	
	if ( IS_NPC(victim) )
	{
		send_to_char( "Not on NPC's.\n\r", ch );
		return;
	}
	
	if ( IS_IMMORTAL(victim) )
	{
		send_to_char( "Not on Immortal's.\n\r", ch );
		return;
	}
	
	if ( ch == victim )
	{
		send_to_char( "You cannot claw yourself.\n\r", ch );
		return;
	}
	
	if (IS_CLASS(victim, CLASS_MAGE))
	{
		send_to_char( "You cannot bite mages.\n\r", ch );
		return;
	}
	
	if ( victim->level != LEVEL_AVATAR && !IS_IMMORTAL(victim) )
	{
		send_to_char( "You can only claw avatars.\n\r", ch );
		return;
	}

        if (HAS_DELAY(victim) || HAS_DELAY(ch))
        {
                send_to_char( "Not with a wait timer...\n\r", ch );
                return;
        }
	
	if (IS_CLASS(victim, CLASS_VAMPIRE) || IS_SET(victim->pcdata->stats[UNI_AFF], VAM_MORTAL))
	{
		send_to_char( "You are unable to create werevamps!\n\r", ch );
		return;
	}

	if (IS_SWWF(victim))
	{
		send_to_char("Do I really have to tell you that you can't do this?\n\r",ch);
		return;
	}


	if ( IS_CLASS(victim, CLASS_WEREWOLF) && victim->clan != CLAN_RONIN)
	{
		send_to_char( "But they are already a werewolf!\n\r", ch );
		return;
	}
	
	if (IS_IMMUNE(victim,IMM_WEREWOLF))
	{
		send_to_char( "You cannot claw an unwilling person.\n\r", ch );
		return;
	}
	
	if (!IS_VAMPAFF(ch,VAM_CLAWS))
	{
		send_to_char("First you better get your claws out!\n\r",ch);
		return;
	}
	
	if (ch->exp < 1000000)
	{
		send_to_char("You cannot afford the 1000000 exp to pass on the gift.\n\r",ch);
		return;
	}
	
	ch->exp = ch->exp - 1000000;
	if (ch->pcdata->stats[UNI_CURRENT] < 1) ch->pcdata->stats[UNI_CURRENT] = 1;
	else ch->pcdata->stats[UNI_CURRENT] += 1;
	if (IS_SET(ch->special,SPC_SIRE)) REMOVE_BIT(ch->special,SPC_SIRE);

       send_to_char( "You thrash the cowering form beneath you, raking your claws along it's soul.\n\r", ch );
       send_to_char( "Then, in the final death throes, you chomp it's neck, tearing out it's essence.\n\r", ch );
       send_to_char( "You breathe your Tribal strength into the bloody corpse.\n\r", ch );
       send_to_char( "They are now forever submissive to your tribe!\n\r", ch );

       send_to_char( "You feel your soul ripped asunder as the Garou Claws your very soul to shreds!!\n\r", victim );
       send_to_char( "As it tears your throat out, and you begin to submit to death itself.\n\r", victim );
       send_to_char( "You suddenly feel a strong, earthly essence overcome your soul.\n\r", victim ); 
       send_to_char( "As the strength of the Garou begins to fill your veins, your mind is flooded \n\r", victim );
       send_to_char( "with the sudden knowledge of Tribal power and everlasting loyalty to the Eldest.\n\r", victim );

       act( "$n suddenly reaches out and claws $N to shreds!", ch, NULL, victim, TO_NOTVICT );
       act( "$n then takes $N's throat in $s mouth, and tears it out!", ch, NULL, victim, TO_NOTVICT );
       act( "$N goes into convulsions, then slowly steadies, then peers up at $n with adoration.", ch, NULL, victim, TO_NOTVICT );


	victim->creature=CLASS_WEREWOLF;
	send_to_char( "\n\rYou are now a werewolf.\n\r", victim );
	if (IS_IMMORTAL(ch))
		victim->pcdata->stats[UNI_GEN] = 3;
	else
		victim->pcdata->stats[UNI_GEN] = ch->pcdata->stats[UNI_GEN] + 1;
	if (ch->pcdata->stats[UNI_GEN] == 1)
		victim->lord = g_string_assign(victim->lord,ch->name->str);
	else
	{
		sprintf(buf,"%s %s",ch->lord->str,ch->name->str);
		victim->lord = g_string_assign(victim->lord,buf);
	}
	
	if (!IS_IMMORTAL(ch))
		victim->clan= ch->clan;
	else
		victim->clan= CLAN_RONIN;
	
	victim->pcdata->stats[UNI_AFF] = 0;
	victim->pcdata->stats[UNI_CURRENT] = 0;
	save_char_obj(ch);
	save_char_obj(victim);
	
	if (IS_IMMORTAL(ch))
		victim->sect = SECT_INDEPENDENT;
	else
		victim->sect = ch->sect;
	
	return;
}

void do_clanname( CHAR_DATA *ch, char *argument )
{
	send_to_char( "Huh?\n\r", ch );
	return;
}

void do_stake( CHAR_DATA *ch, char *argument )
{
	CHAR_DATA *victim;
	OBJ_DATA  *stake;
	char      arg [MAX_INPUT_LENGTH];
	int       blood;
	
	//Removed for now - Spiral
	send_to_char("Nope, not in this life time.\n\r",ch);
	return;

	argument = one_argument( argument, arg );
	if (IS_NPC( ch )) return;
	
	if ( arg[0] == '\0' )
	{
		send_to_char( "Stake whom?\n\r", ch );
		return;
	}
	
	if ( ( victim = get_char_room( ch, arg ) ) == NULL )
	{
		send_to_char( "They aren't here.\n\r", ch );
		return;
	}
	
	stake = get_eq_char( ch, WEAR_HOLD );
	if ( stake == NULL || stake->item_type != ITEM_STAKE )
	{
		stake = get_eq_char( ch, WEAR_WIELD );
		if ( stake == NULL || stake->item_type != ITEM_STAKE )
		{
			send_to_char( "How can you stake someone down without holding a stake?\n\r", ch );
			return;
		}
	}
	
	if ( IS_NPC(victim) )
	{
		send_to_char( "Not on NPC's.\n\r", ch );
		return;
	}
	
	if ( ch == victim )
	{
		send_to_char( "You cannot stake yourself.\n\r", ch );
		return;
	}
	
	if (!IS_CLASS(victim, CLASS_VAMPIRE))
	{
		send_to_char( "You can only stake vampires.\n\r", ch );
		return;
	}
	
	if (victim->position > POS_MORTAL)
	{
		send_to_char( "You can only stake down a vampire who is mortally wounded.\n\r", ch );
		return;
	}
	
	act("You plunge $p into $N's heart.", ch, stake, victim, TO_CHAR);
	act("$n plunges $p into $N's heart.", ch, stake, victim, TO_NOTVICT);
	send_to_char( "You feel a stake plunged through your heart.\n\r", victim );
	if (IS_IMMUNE(victim,IMM_STAKE)) return;
	
    /* Have to make sure they have enough blood to change back */
	blood = victim->pcdata->condition[COND_THIRST];
	victim->pcdata->condition[COND_THIRST] = 666;
	
    /* To take care of vampires who have powers in affect. */
	if (IS_VAMPAFF(victim,VAM_DISGUISED) ) power_mask(victim,victim,"self");
	if (IS_IMMUNE(victim,IMM_SHIELDED) ) power_shield(victim,victim,argument);
	if (IS_VAMPAFF(victim,VAM_FANGS) ) power_fangs(victim,victim,argument);
	if (IS_VAMPAFF(victim,VAM_CLAWS) ) power_claws(victim,victim,argument);
	if (IS_VAMPAFF(victim,VAM_NIGHTSIGHT) ) power_nightsight(victim,victim,argument);
	if (IS_SET(victim->act,PLR_HOLYLIGHT) ) power_truesight(victim,victim,argument);
	if (IS_VAMPAFF(victim,VAM_CHANGED) ) power_change(victim,victim,"human");
	if (IS_POLYAFF(victim,POLY_SERPENT) ) power_serpent(victim,victim,argument);
	victim->pcdata->stats[UNI_RAGE] = 0;
	victim->pcdata->condition[COND_THIRST] = blood;
	
	REMOVE_BIT(victim->creature, CLASS_VAMPIRE);
	obj_from_char(stake);
	obj_to_char(stake,victim);
	ch->exp = ch->exp + 1000;
	victim->home = 3001;
	return;
}



void do_clandisc( CHAR_DATA *ch, char *argument )
{
	char arg [MAX_INPUT_LENGTH];
	char buf [MAX_STRING_LENGTH];
	char buf2 [MAX_STRING_LENGTH];
	char clan_list [MAX_STRING_LENGTH];
	char buy_list [MAX_STRING_LENGTH];
	int count;
	int discipline;
	bool fFound = FALSE;
	bool fCanBuy = FALSE;
	int lcount = 0;
	int clancount = 0;
	int clanmax = 10;
	int ratemax = 10;			  //What the Hell is this??? - Spiral
	int cost[MAX_DISCIPLINE];
	argument = one_argument( argument, arg );
	
	if (IS_NPC(ch)) return;
	
	if ( !IS_CLASS(ch,CLASS_VAMPIRE) )
	{
		send_to_char( "Huh?\n\r", ch );
		return;
	}
	
	if (ch->pcdata->stats[UNI_CURRENT] == -1) 
	{
		for ( count = 0 ; count < MAX_DISCIPLINE ; count++ )
		{
			if ( get_disc(ch,count) > 0 )
				ch->pcdata->inherited[count] = 1;
		}
	}
	
	if (ch->pcdata->stats[UNI_GEN] >= 2)
	{
		clanmax = 12;
		ratemax = 9;
	}
	if (ch->pcdata->stats[UNI_GEN] >= 3) ratemax = 8;
	if (ch->pcdata->stats[UNI_GEN] >= 4)
	{
		clanmax = UMAX( 3, ( 14 -  ch->pcdata->stats[UNI_GEN] ) );
		ratemax = 6;
	}
	if (ch->pcdata->stats[UNI_GEN] >= 5) clanmax += 1;

//	if (ch->pcdata->stats[UNI_GEN] >= 6) ratemax = 5;
//	if (ch->pcdata->stats[UNI_GEN] >= 8) ratemax = 4;
	
	if (ch->pcdata->stats[UNI_GEN] >= 7) ratemax = 5;
	if (ch->pcdata->stats[UNI_GEN] >=10) ratemax = 4;
	
	if (ch->pcdata->rank == AGE_ANCILLA     ) clanmax += 1;
	if (ch->pcdata->rank == AGE_ELDER       ) clanmax += 2;
	if (ch->pcdata->rank == AGE_METHUSELAH  ) 
	{
		ratemax += 1;
		clanmax += 3;
		//extra Disc for those Meth Vamps
	}

	for ( count = 0 ; count < MAX_DISCIPLINE ; count++ )
	{
		if ( get_disc(ch,count) > 0 || IS_VAMPPASS(ch,count) )
			clancount++;
	}
	
	str_cpy(buy_list,"");
	
	for ( count = 0 ; count < MAX_DISCIPLINE ; count++ )
	{
		cost[count] = 0;
		if ( IS_VAMPPASS(ch,count) )
			cost[count] = ( get_disc(ch,count) >= ratemax ? 0 :
				COST_DIS * get_disc(ch,count) ) ;
		else if ( get_disc(ch, count) > 0 || clancount < clanmax )
			cost[count] = ( get_disc(ch,count) >= ratemax ? 0 : COST_DIS
				* (get_disc(ch,count) + 1) + COST_DIS);
		
		if ( cost[count] != 0 && cost[count] <= ch->practice )
		{
			fCanBuy = TRUE;
			sprintf(buf2," %s %d: %d\n\r", IS_VAMPPASS(ch,count) ? 
				discipline_table[count].name_caps :
				discipline_table[count].name,
				get_disc(ch,count) + 1, cost[count]);
			strcat(buy_list, buf2);
		}
	}
	
	if ( arg[0] == '\0' )
	{
			
		send_to_char("Current powers:\n\r",ch);
		str_cpy(clan_list,"");
		str_cpy(buf,"");
		for ( count = 0 ; count < MAX_DISCIPLINE ; count++ )
		{

			str_cpy(buf2,"");

			if ( get_disc(ch,count) > 0 && !IS_VAMPPASS(ch,count) )
			{
				sprintf(buf2,"{R%s	{B[{W%3d{B]{x", discipline_table[count].name, get_disc(ch,count));
				fFound = TRUE;
			}
			else if ( IS_VAMPPASS(ch,count) )
			{
				sprintf(buf2,"{R%s 	{B[{W%3d{B]{x", discipline_table[count].name_caps, get_disc(ch,count));
				fFound = TRUE;
			}

			if (strcmp(buf2,""))
			{
				lcount += 1;
				if ( lcount >= 3 )
				{
					strcat(clan_list,"	");
					strcat(clan_list, buf2);
					strcat(clan_list, "\n\r");
					send_to_char(clan_list, ch);
					lcount = 0;
					str_cpy(clan_list, "");
				}
				else
				{
					if ( lcount > 1 )
						strcat(clan_list,"	");
					strcat(clan_list, buf2);
				}
			}
			
		}
	        	
		if (fFound)
		{
			strcat(buf,clan_list);
			send_to_char(buf,ch);
		}
		else
			send_to_char(" None",ch);
		
		if (clancount <= clanmax)
		{
			if ( fCanBuy )
			{
				send_to_char("It will cost you in primal as "
					"shown to train these disciplines:\n\r",ch);
				send_to_char(buy_list,ch);
				sprintf(buf,"You have {y%d{x primal.\n\r", ch->practice);
				send_to_char(buf,ch);
			}
			
		}
		
		return;
	}
	
	if ( (discipline = discipline_lookup(arg)) != -1 )
	{ 
		if ( cost[discipline] > ch->practice 
			||   cost[discipline] == 0
			|| ( clancount >= clanmax 
				&&   get_disc(ch,discipline) == 0 ) )
			
		{
			sprintf(buf,"Powers: %s\n\r", discipline_table[discipline].powers);
			send_to_char(buf,ch);
			return;
		}
		
		sprintf(buf,"You master the discipline of {R%s %d{x.\n\r",
			discipline_table[discipline].name,
			get_disc(ch,discipline) + 1);
		send_to_char(buf, ch);
/*
        clan_table_powerselect(ch,discipline_table[discipline].name);
*/
		if (clancount < 3 )
			ch->pcdata->inherited[discipline] = 1;

		ch->pcdata->discipline[discipline]++;
		ch->practice -= cost[discipline];
		return;
	}
	else
		send_to_char( "No such discipline.\n\r", ch );
	return;
	
}

void do_garou( CHAR_DATA *ch, char *argument )
{
	char      arg [MAX_INPUT_LENGTH];
	argument = one_argument( argument, arg );
	
	if (IS_NPC(ch)) return;
	
	if (IS_IMMUNE(ch, IMM_WEREWOLF))
	{
		send_to_char("You will now allow werewolves to claw you.\n\r",ch);
		REMOVE_BIT(ch->immune, IMM_WEREWOLF);
		return;
	}
	send_to_char("You will no longer allow werewolves to claw you.\n\r",ch);
	SET_BIT(ch->immune, IMM_WEREWOLF);
	return;
}

void do_vampire( CHAR_DATA *ch, char *argument )
{
	char      arg [MAX_INPUT_LENGTH];
	argument = one_argument( argument, arg );
	
	if (IS_NPC(ch)) return;
	
	if (IS_IMMUNE(ch, IMM_VAMPIRE))
	{
		send_to_char("You will now allow vampires to bite you.\n\r",ch);
		REMOVE_BIT(ch->immune, IMM_VAMPIRE);
		return;
	}
	send_to_char("You will no longer allow vampires to bite you.\n\r",ch);
	SET_BIT(ch->immune, IMM_VAMPIRE);
	return;
}



void do_introduce( CHAR_DATA *ch, char *argument )
{
	char      arg [MAX_INPUT_LENGTH];
	argument = one_argument( argument, arg );
	
	if (IS_NPC(ch)) return;
	
	if (IS_CLASS(ch, CLASS_VAMPIRE) && ch->pcdata->stats[UNI_GEN] > 0 && ch->pcdata->stats[UNI_GEN] < 8)
		do_tradition(ch,ch->lord->str);
	else if (IS_CLASS(ch, CLASS_WEREWOLF) && IS_HERO(ch)) 
		//&& ch->pcdata->stats[UNI_GEN] > 0 && ch->pcdata->stats[UNI_GEN] < 5)
		do_bloodline(ch,ch->lord->str);
	else send_to_char("Huh?\n\r",ch);
	return;
}

void do_bloodline( CHAR_DATA *ch, char *argument )
{
	char      arg1 [MAX_INPUT_LENGTH];
	char      arg2 [MAX_INPUT_LENGTH];
	char      arg3 [MAX_INPUT_LENGTH];
	char      buf  [MAX_STRING_LENGTH];
	char      buf2 [MAX_STRING_LENGTH];
	
	argument = one_argument( argument, arg1 );
	argument = one_argument( argument, arg2 );
	argument = one_argument( argument, arg3 );
	
	if (IS_NPC(ch)) return;
	
	if (arg1 != '\0') arg1[0] = UPPER(arg1[0]);
	if (arg2 != '\0') arg2[0] = UPPER(arg2[0]);
	if (arg3 != '\0') arg3[0] = UPPER(arg3[0]);
	
	if ( ch->clan == CLAN_NONE && ch->pcdata->stats[UNI_GEN] != 1 )
	{
		str_cpy(buf,"In the name of Gaia, I announce my Garou heritage.");
		do_say(ch,buf);
		sprintf(buf,"My name is %s, I am a Ronin of no tribe.", ch->name->str);
		do_say(ch,buf);
		return;
	}
	str_cpy(buf,"In the name of Gaia, I announce my Garou heritage.");
	do_say(ch,buf);
	if (ch->pcdata->stats[UNI_GEN] != 1)
	{
		if      (ch->pcdata->stats[UNI_GEN] >= 4) sprintf(buf2,"%s",arg3);
		else if (ch->pcdata->stats[UNI_GEN] == 3) sprintf(buf2,"%s",arg2);
		else if (ch->pcdata->stats[UNI_GEN] == 2) sprintf(buf2,"%s",arg1);
		if (ch->pcdata->stats[UNI_GEN] == 1)
			sprintf(buf,"My name is %s, chosen Champion of Gaia.", ch->name->str);
		if (ch->pcdata->stats[UNI_GEN] == 2)
			sprintf(buf,"My name is %s, Chieftain of the %s tribe, pup of %s.", ch->name->str,iclan_table[ch->clan].pretty_name,buf2);
		else
			sprintf(buf,"My name is %s, of the %s tribe, pup of %s.", ch->name->str,iclan_table[ch->clan].pretty_name,buf2);
		do_say(ch,buf);
	}
	if ( arg3[0] != '\0' )
	{
		sprintf(buf,"My name is %s, of the %s tribe, pup of %s.",
			arg3,iclan_table[ch->clan].pretty_name,arg2);
		do_say(ch,buf);
	}
	if ( arg2[0] != '\0' )
	{
		if ( arg1[0] != '\0' )
			sprintf(buf,"My name is %s, Chieftain of the %s tribe, pup of %s.",arg2,iclan_table[ch->clan].pretty_name,arg1);
		else
			sprintf(buf,"My name is %s, of the %s tribe, pup of %s.",arg2,iclan_table[ch->clan].pretty_name,arg1);
		do_say(ch,buf);
	}
	if ( ch->pcdata->stats[UNI_GEN] == 1 )
		sprintf(buf,"My name is %s, chosen Champion of Gaia.", ch->name->str);
	else
		sprintf(buf,"My name is %s, chosen Champion of Gaia.", arg1);
	do_say(ch,buf);
	return;
}

void do_tradition( CHAR_DATA *ch, char *argument )
{
	char      arg1 [MAX_INPUT_LENGTH];
	char      arg2 [MAX_INPUT_LENGTH];
	char      arg3 [MAX_INPUT_LENGTH];
	char      arg4 [MAX_INPUT_LENGTH];
	char      arg5 [MAX_INPUT_LENGTH];
	char      arg6 [MAX_INPUT_LENGTH];
	char      buf  [MAX_INPUT_LENGTH];
	char      buf2 [MAX_INPUT_LENGTH];
	char      buf3 [MAX_INPUT_LENGTH];
	
	argument = one_argument( argument, arg1 );
	argument = one_argument( argument, arg2 );
	argument = one_argument( argument, arg3 );
	argument = one_argument( argument, arg4 );
	argument = one_argument( argument, arg5 );
	argument = one_argument( argument, arg6 );
	
	if (IS_NPC(ch)) return;
	
	if (arg1 != '\0') arg1[0] = UPPER(arg1[0]);
	if (arg2 != '\0') arg2[0] = UPPER(arg2[0]);
	if (arg3 != '\0') arg3[0] = UPPER(arg3[0]);
	if (arg4 != '\0') arg4[0] = UPPER(arg4[0]);
	if (arg5 != '\0') arg5[0] = UPPER(arg5[0]);
	if (arg6 != '\0') arg6[0] = UPPER(arg6[0]);
	
/*  if (!str_cmp(arg1,"kavir")) str_cpy(arg1,"KaVir");   */
	
	if (!IS_CLASS(ch, CLASS_VAMPIRE) || (ch->pcdata->stats[UNI_GEN] < 1) || (ch->pcdata->stats[UNI_GEN] > 7))
	{
		send_to_char("Huh?\n\r",ch);
		return;
	}
/*
    if ( !str_cmp(ch->clan,"") && ch->pcdata->stats[UNI_GEN] == 2 )
    {
	send_to_char( "Not until you've created your own clan!\n\r", ch );
	return;
    }
*/
	if      (ch->pcdata->stats[UNI_GEN] == 2)                   sprintf(buf3,"Antediluvian");
	else if (ch->pcdata->rank == AGE_NEONATE)    sprintf(buf3,"Neonate");
	else if (ch->pcdata->rank == AGE_ANCILLA)    sprintf(buf3,"Ancilla");
	else if (ch->pcdata->rank == AGE_ELDER)      sprintf(buf3,"Elder");
	else if (ch->pcdata->rank == AGE_METHUSELAH) sprintf(buf3,"Methuselah");
	else                                         sprintf(buf3,"Childe");
	
	if      (ch->pcdata->stats[UNI_GEN] == 7) sprintf(buf2,"Seventh");
	else if (ch->pcdata->stats[UNI_GEN] == 6) sprintf(buf2,"Sixth");
	else if (ch->pcdata->stats[UNI_GEN] == 5) sprintf(buf2,"Fifth");
	else if (ch->pcdata->stats[UNI_GEN] == 4) sprintf(buf2,"Fourth");
	else if (ch->pcdata->stats[UNI_GEN] == 3) sprintf(buf2,"Third");
	else if (ch->pcdata->stats[UNI_GEN] == 2) sprintf(buf2,"Second");
	if (ch->pcdata->stats[UNI_GEN] == 1)
		sprintf(buf,"As is the tradition, I recite the lineage of %s, Sire of all Kindred.",ch->name->str);
	else
		sprintf(buf,"As is the tradition, I recite the lineage of %s, %s of the %s Generation.",ch->name->str,buf3,buf2);
	do_say(ch,buf);
	if ( ch->pcdata->stats[UNI_GEN] != 1 )
	{
		if      (ch->pcdata->stats[UNI_GEN] == 7) sprintf(buf2,"%s",arg6);
		else if (ch->pcdata->stats[UNI_GEN] == 6) sprintf(buf2,"%s",arg5);
		else if (ch->pcdata->stats[UNI_GEN] == 5) sprintf(buf2,"%s",arg4);
		else if (ch->pcdata->stats[UNI_GEN] == 4) sprintf(buf2,"%s",arg3);
		else if (ch->pcdata->stats[UNI_GEN] == 3) sprintf(buf2,"%s",arg2);
		else if (ch->pcdata->stats[UNI_GEN] == 2) sprintf(buf2,"%s",arg1);
		
		if (IS_SET(ch->special, SPC_ANARCH) || ch->clan == CLAN_NONE)
			sprintf(buf,"My name is %s.  I am of no clan.  My sire is %s.", ch->name->str,buf2);
		else if (ch->pcdata->stats[UNI_GEN] == 2)
			sprintf(buf,"My name is %s. I founded %s.  My sire is %s.", ch->name->str,iclan_table[ch->clan].pretty_name,buf2);
		else
			sprintf(buf,"My name is %s.  I am of %s.  My sire is %s.", ch->name->str,iclan_table[ch->clan].pretty_name,buf2);
		do_say(ch,buf);
	}
	if ( arg6[0] != '\0' )
	{
		sprintf(buf,"My name is %s.  My sire is %s.",
			arg6,arg5);
		do_say(ch,buf);
	}
	if ( arg5[0] != '\0' )
	{
		sprintf(buf,"My name is %s.  My sire is %s.",
			arg5,arg4);
		do_say(ch,buf);
	}
	if ( arg4[0] != '\0' )
	{
		sprintf(buf,"My name is %s.  My sire is %s.",
			arg4,arg3);
		do_say(ch,buf);
	}
	if ( arg3[0] != '\0' )
	{
		sprintf(buf,"My name is %s.  My sire is %s.",
			arg3,arg2);
		do_say(ch,buf);
	}
	if ( arg2[0] != '\0' )
	{
		sprintf(buf,"My name is %s.  My sire is %s.",arg2,arg1);
		do_say(ch,buf);
	}
	if ( ch->pcdata->stats[UNI_GEN] == 1 )
		sprintf(buf,"My name is %s.  All Kindred are my childer.",ch->name->str);
	else
		sprintf(buf,"My name is %s.  All Kindred are my childer.",arg1);
	do_say(ch,buf);
	if ( ch->pcdata->stats[UNI_GEN] == 7 ) sprintf(buf,"My name is %s, childe of %s, childe of %s, childe of %s, childe of %s, childe of %s, childe of %s.  Recognize my lineage.",ch->name->str,arg6,arg5,arg4,arg3,arg2,arg1);
	if ( ch->pcdata->stats[UNI_GEN] == 6 ) sprintf(buf,"My name is %s, childe of %s, childe of %s, childe of %s, childe of %s, childe of %s.  Recognize my lineage.",ch->name->str,arg5,arg4,arg3,arg2,arg1);
	if ( ch->pcdata->stats[UNI_GEN] == 5 ) sprintf(buf,"My name is %s, childe of %s, childe of %s, childe of %s, childe of %s.  Recognize my lineage.",ch->name->str,arg4,arg3,arg2,arg1);
	if ( ch->pcdata->stats[UNI_GEN] == 4 ) sprintf(buf,"My name is %s, childe of %s, childe of %s, childe of %s.  Recognize my lineage.",ch->name->str,arg3,arg2,arg1);
	if ( ch->pcdata->stats[UNI_GEN] == 3 ) sprintf(buf,"My name is %s, childe of %s, childe of %s.  Recognize my lineage.",ch->name->str,arg2,arg1);
	if ( ch->pcdata->stats[UNI_GEN] == 2 ) sprintf(buf,"My name is %s, childe of %s.  Recognize my lineage.",ch->name->str,arg1);
	if ( ch->pcdata->stats[UNI_GEN] == 1 ) sprintf(buf,"My name is %s.  Recognize my lineage.",ch->name->str);
	do_say(ch,buf);
	return;
}


void do_mortalvamp( CHAR_DATA *ch, char *argument )
{
	char      arg [MAX_INPUT_LENGTH];
	int       blood;
	
	argument = one_argument( argument, arg );
	
	if (IS_NPC(ch)) return;
	if (IS_CLASS(ch,CLASS_VAMPIRE) )
	{
    	/* Have to make sure they have enough blood to change back */
		blood = ch->pcdata->condition[COND_THIRST];
		ch->pcdata->condition[COND_THIRST] = 666;
		
	/* 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,argument);
		if (IS_VAMPAFF(ch,VAM_FANGS) ) power_fangs(ch,ch,argument);
		if (IS_VAMPAFF(ch,VAM_CLAWS) ) power_claws(ch,ch,argument);
		if (IS_VAMPAFF(ch,VAM_NIGHTSIGHT) ) power_nightsight(ch,ch,argument);
		if (IS_SET(ch->act,PLR_HOLYLIGHT) ) power_truesight(ch,ch,argument);
		if (IS_VAMPAFF(ch,VAM_CHANGED) ) power_change(ch,ch,"human");
		if (IS_POLYAFF(ch,POLY_SERPENT) ) power_serpent(ch,ch,argument);
		ch->pcdata->stats[UNI_RAGE] = 0;
		ch->pcdata->condition[COND_THIRST] = blood;
		
		send_to_char("You loose your vampire powers.\n\r",ch);
		
		REMOVE_BIT(ch->creature, CLASS_VAMPIRE);
		SET_BIT(ch->pcdata->stats[UNI_AFF], VAM_MORTAL);
		return;
	}
	send_to_char("You regain your vampire powers.\n\r",ch);
	ch->creature= CLASS_VAMPIRE;
	REMOVE_BIT(ch->pcdata->stats[UNI_AFF], VAM_MORTAL);
	return;
}

void do_regenerate( CHAR_DATA *ch, char *argument )
{
	char       arg [MAX_INPUT_LENGTH];
	double min = 50;
	double max = 150;
	
	argument = one_argument( argument, arg );
	
	if (IS_NPC(ch)) return;
	
	if (!IS_CLASS(ch, CLASS_VAMPIRE))
	{
		send_to_char("Huh?\n\r",ch);
		return;
	}
	
	if (ch->pcdata->stats[UNI_RAGE] > 0)
	{
		send_to_char("You cannot control your regenerative powers while the beast is so strong.\n\r",ch);
		return;
	}
	
	if ( ch->position == POS_FIGHTING )
	{
		send_to_char("You cannot regenerate while fighting.\n\r",ch);
		return;
	}
	
	if ( ch->hit >= ch->max_hit && ch->mana >= ch->max_mana && ch->move >= ch->max_move )
	{
		send_to_char("But you are already completely regenerated!\n\r",ch);
		return;
	}
	
	if ( ch->pcdata->condition[COND_THIRST] < 5 )
	{
		send_to_char("You have insufficient blood.\n\r",ch);
		return;
	}
	
	if (IS_AFFECTED(ch,AFF_AGGDAM))
	{
		min = 25;
		max = 50;	
	}

	if ( IS_ITEMAFF(ch, ITEMA_REGENERATE) )
    {
         spell_clot(skill_lookup("clot"), AUTO_REGEN, ch, ch);
         spell_mend(skill_lookup("mend"), AUTO_REGEN, ch, ch);

         if (number_percent() < 50) 
         {
         	min *= 1.20;
         	max *= 1.20;        /*    50% of a  20% */
         }
         else if (number_percent() < 50) 
         {
         	min *= 1.40;
         	max *= 1.40;   /*    25% of a  40% */
         }
         else if (number_percent() < 50)
         {
         	min *= 1.80;	
         	max *= 1.80;   /*  12.5% of a  80% */
         }
         else if (number_percent() < 50) 
         {
         	min *= 2.60;
         	max *= 2.60;   /*  6.25% of a 160% */
         }
         else if (number_percent() < 50)
         {
         	min *= 5;
         	max *= 5;      /* 3.125% of a 400% */
    	 }
    }


	
	ch->pcdata->condition[COND_THIRST] -= number_range(4,10);
	if ( ch->hit >= ch->max_hit && ch->mana >= ch->max_mana && ch->move >= ch->max_move )
	{
		send_to_char("Your body has completely regenerated.\n\r",ch);
		act("$n's body completely regenerates itself.",ch,NULL,NULL,TO_ROOM);
	}
	else
		send_to_char("Your body slowly regenerates itself.\n\r",ch);
	if (ch->hit < 1 )
	{
		ch->hit = ch->hit + 1;
		update_pos(ch);
		WAIT_STATE( ch, 24 );
	}
	else
	{
		min += 2 * (10 - ch->pcdata->stats[UNI_GEN]);
		max += 2 * (20 - (ch->pcdata->stats[UNI_GEN] * 2));
		ch->hit = UMIN(ch->hit + number_range((int)min,(int)max), ch->max_hit);
		ch->mana = UMIN(ch->mana + number_range((int)min,(int)max), ch->max_mana);
		ch->move = UMIN(ch->move + number_range((int)min,(int)max), ch->max_move);
		update_pos(ch);
	}
	return;
}

void werewolf_regen( CHAR_DATA *ch )
{
	double min = 50;
	double max = 100;
	
	if (IS_NPC(ch)) return;
	
	if (IS_AFFECTED(ch,AFF_AGGDAM))
	{
		min = 25;
		max = 50;
	}

	if ( IS_ITEMAFF(ch, ITEMA_REGENERATE) )
    {
         spell_clot(skill_lookup("clot"), AUTO_REGEN, ch, ch);
         spell_mend(skill_lookup("mend"), AUTO_REGEN, ch, ch);

         if (number_percent() < 50) 
         {
         	min *= 1.20;
         	max *= 1.20;        /*    50% of a  20% */
         }
         else if (number_percent() < 50) 
         {
         	min *= 1.40;
         	max *= 1.40;   /*    25% of a  40% */
         }
         else if (number_percent() < 50)
         {
         	min *= 1.80;	
         	max *= 1.80;   /*  12.5% of a  80% */
         }
         else if (number_percent() < 50) 
         {
         	min *= 2.60;
         	max *= 2.60;   /*  6.25% of a 160% */
         }
         else if (number_percent() < 50)
         {
         	min *= 5;
         	max *= 5;      /* 3.125% of a 400% */
    	 }
    }


	
	if (ch->hit < 10 ) 
	{
		ch->hit = ch->hit + 1;
		update_pos(ch);
	}
	else
	{
		min += 10;
		max += 20;
		ch->hit = UMIN(ch->hit + number_range((int)min,(int)max), ch->max_hit);
		ch->mana = UMIN(ch->mana + number_range((int)min,(int)max), ch->max_mana);
		ch->move = UMIN(ch->move + number_range((int)min,(int)max), ch->max_move);
		if ( ch->hit >= ch->max_hit && ch->mana >= ch->max_mana && ch->move >= ch->max_move )
			send_to_char("Your body has completely regenerated itself.\n\r",ch);
	}
	return;
}

void reg_mend( CHAR_DATA *ch )
{
	int ribs = 0;
	int teeth = 0;
	
	if (IS_BODY(ch,BROKEN_RIBS_1 )) ribs += 1;
	if (IS_BODY(ch,BROKEN_RIBS_2 )) ribs += 2;
	if (IS_BODY(ch,BROKEN_RIBS_4 )) ribs += 4;
	if (IS_BODY(ch,BROKEN_RIBS_8 )) ribs += 8;
	if (IS_BODY(ch,BROKEN_RIBS_16)) ribs += 16;
	if (IS_HEAD(ch,LOST_TOOTH_1  )) teeth += 1;
	if (IS_HEAD(ch,LOST_TOOTH_2  )) teeth += 2;
	if (IS_HEAD(ch,LOST_TOOTH_4  )) teeth += 4;
	if (IS_HEAD(ch,LOST_TOOTH_8  )) teeth += 8;
	if (IS_HEAD(ch,LOST_TOOTH_16 )) teeth += 16;
	
	if (ribs > 0)
	{
		if (IS_BODY(ch,BROKEN_RIBS_1 ))
			REMOVE_BIT(ch->loc_hp[1],BROKEN_RIBS_1);
		if (IS_BODY(ch,BROKEN_RIBS_2 ))
			REMOVE_BIT(ch->loc_hp[1],BROKEN_RIBS_2);
		if (IS_BODY(ch,BROKEN_RIBS_4 ))
			REMOVE_BIT(ch->loc_hp[1],BROKEN_RIBS_4);
		if (IS_BODY(ch,BROKEN_RIBS_8 ))
			REMOVE_BIT(ch->loc_hp[1],BROKEN_RIBS_8);
		if (IS_BODY(ch,BROKEN_RIBS_16))
			REMOVE_BIT(ch->loc_hp[1],BROKEN_RIBS_16);
		ribs -= 1;
		if (ribs >= 16) {ribs -= 16;
		SET_BIT(ch->loc_hp[1],BROKEN_RIBS_16);}
		if (ribs >= 8 ) {ribs -= 8;
		SET_BIT(ch->loc_hp[1],BROKEN_RIBS_8);}
		if (ribs >= 4 ) {ribs -= 4;
		SET_BIT(ch->loc_hp[1],BROKEN_RIBS_4);}
		if (ribs >= 2 ) {ribs -= 2;
		SET_BIT(ch->loc_hp[1],BROKEN_RIBS_2);}
		if (ribs >= 1 ) {ribs -= 1;
		SET_BIT(ch->loc_hp[1],BROKEN_RIBS_1);}
		act("One of $n's ribs snap back into place.",ch,NULL,NULL,TO_ROOM);
		act("One of your ribs snap back into place.",ch,NULL,NULL,TO_CHAR);
	}
	else if (IS_HEAD(ch,LOST_EYE_L))
	{
		act("An eyeball appears in $n's left eye socket.",ch,NULL,NULL,TO_ROOM);
		act("An eyeball appears in your left eye socket.",ch,NULL,NULL,TO_CHAR);
		REMOVE_BIT(ch->loc_hp[LOC_HEAD],LOST_EYE_L);
	}
	else if (IS_HEAD(ch,LOST_EYE_R))
	{
		act("An eyeball appears in $n's right eye socket.",ch,NULL,NULL,TO_ROOM);
		act("An eyeball appears in your right eye socket.",ch,NULL,NULL,TO_CHAR);
		REMOVE_BIT(ch->loc_hp[LOC_HEAD],LOST_EYE_R);
	}
	else if (IS_HEAD(ch,LOST_EAR_L))
	{
		act("An ear grows on the left side of $n's head.",ch,NULL,NULL,TO_ROOM);
		act("An ear grows on the left side of your head.",ch,NULL,NULL,TO_CHAR);
		REMOVE_BIT(ch->loc_hp[LOC_HEAD],LOST_EAR_L);
	}
	else if (IS_HEAD(ch,LOST_EAR_R))
	{
		act("An ear grows on the right side of $n's head.",ch,NULL,NULL,TO_ROOM);
		act("An ear grows on the right side of your head.",ch,NULL,NULL,TO_CHAR);
		REMOVE_BIT(ch->loc_hp[LOC_HEAD],LOST_EAR_R);
	}
	else if (IS_HEAD(ch,LOST_NOSE))
	{
		act("A nose grows on the front of $n's face.",ch,NULL,NULL,TO_ROOM);
		act("A nose grows on the front of your face.",ch,NULL,NULL,TO_CHAR);
		REMOVE_BIT(ch->loc_hp[LOC_HEAD],LOST_NOSE);
		REMOVE_BIT(ch->loc_hp[LOC_HEAD],BROKEN_NOSE);
	}
	else if (teeth > 0)
	{
		if (IS_HEAD(ch,LOST_TOOTH_1 ))
			REMOVE_BIT(ch->loc_hp[LOC_HEAD],LOST_TOOTH_1);
		if (IS_HEAD(ch,LOST_TOOTH_2 ))
			REMOVE_BIT(ch->loc_hp[LOC_HEAD],LOST_TOOTH_2);
		if (IS_HEAD(ch,LOST_TOOTH_4 ))
			REMOVE_BIT(ch->loc_hp[LOC_HEAD],LOST_TOOTH_4);
		if (IS_HEAD(ch,LOST_TOOTH_8 ))
			REMOVE_BIT(ch->loc_hp[LOC_HEAD],LOST_TOOTH_8);
		if (IS_HEAD(ch,LOST_TOOTH_16))
			REMOVE_BIT(ch->loc_hp[LOC_HEAD],LOST_TOOTH_16);
		teeth -= 1;
		if (teeth >= 16) {teeth -= 16;
		SET_BIT(ch->loc_hp[LOC_HEAD],LOST_TOOTH_16);}
		if (teeth >= 8 ) {teeth -= 8;
		SET_BIT(ch->loc_hp[LOC_HEAD],LOST_TOOTH_8);}
		if (teeth >= 4 ) {teeth -= 4;
		SET_BIT(ch->loc_hp[LOC_HEAD],LOST_TOOTH_4);}
		if (teeth >= 2 ) {teeth -= 2;
		SET_BIT(ch->loc_hp[LOC_HEAD],LOST_TOOTH_2);}
		if (teeth >= 1 ) {teeth -= 1;
		SET_BIT(ch->loc_hp[LOC_HEAD],LOST_TOOTH_1);}
		act("A missing tooth grows in your mouth.",ch,NULL,NULL,TO_CHAR);
		act("A missing tooth grows in $n's mouth.",ch,NULL,NULL,TO_ROOM);
	}
	else if (IS_HEAD(ch,BROKEN_NOSE))
	{
		act("$n's nose snaps back into place.",ch,NULL,NULL,TO_ROOM);
		act("Your nose snaps back into place.",ch,NULL,NULL,TO_CHAR);
		REMOVE_BIT(ch->loc_hp[LOC_HEAD],BROKEN_NOSE);
	}
	else if (IS_HEAD(ch,BROKEN_JAW))
	{
		act("$n's jaw snaps back into place.",ch,NULL,NULL,TO_ROOM);
		act("Your jaw snaps back into place.",ch,NULL,NULL,TO_CHAR);
		REMOVE_BIT(ch->loc_hp[LOC_HEAD],BROKEN_JAW);
	}
	else if (IS_HEAD(ch,BROKEN_SKULL))
	{
		act("$n's bloody skull knits itself back together.",ch,NULL,NULL,TO_ROOM);
		act("Your bloody skull knits itself back together.",ch,NULL,NULL,TO_CHAR);
		REMOVE_BIT(ch->loc_hp[LOC_HEAD],BROKEN_SKULL);
	}
	else if (IS_BODY(ch,BROKEN_SPINE))
	{
		act("$n's spine knits itself back together.",ch,NULL,NULL,TO_ROOM);
		act("Your spine knits itself back together.",ch,NULL,NULL,TO_CHAR);
		REMOVE_BIT(ch->loc_hp[LOC_BODY],BROKEN_SPINE);
	}
	else if (IS_BODY(ch,BROKEN_NECK))
	{
		act("$n's neck snaps back into place.",ch,NULL,NULL,TO_ROOM);
		act("Your neck snaps back into place.",ch,NULL,NULL,TO_CHAR);
		REMOVE_BIT(ch->loc_hp[LOC_BODY],BROKEN_NECK);
	}
	else if (IS_ARM_L(ch,LOST_ARM))
	{
		act("An arm grows from the bloody stump of $n's left shoulder.",ch,NULL,NULL,TO_ROOM);
		act("An arm grows from the bloody stump of your left shoulder.",ch,NULL,NULL,TO_CHAR);
		REMOVE_BIT(ch->loc_hp[LOC_ARM_L],LOST_ARM);
		REMOVE_BIT(ch->loc_hp[LOC_ARM_L],BROKEN_ARM);
		SET_BIT(ch->loc_hp[LOC_ARM_L],LOST_HAND);
	}
	else if (IS_ARM_R(ch,LOST_ARM))
	{
		act("An arm grows from the bloody stump of $n's right shoulder.",ch,NULL,NULL,TO_ROOM);
		act("An arm grows from the bloody stump of your right shoulder.",ch,NULL,NULL,TO_CHAR);
		REMOVE_BIT(ch->loc_hp[LOC_ARM_R],LOST_ARM);
		REMOVE_BIT(ch->loc_hp[LOC_ARM_R],BROKEN_ARM);
		SET_BIT(ch->loc_hp[LOC_ARM_R],LOST_HAND);
	}
	else if (IS_LEG_L(ch,LOST_LEG))
	{
		act("A leg grows from the bloody stump of $n's left hip.",ch,NULL,NULL,TO_ROOM);
		act("A leg grows from the bloody stump of your left hip.",ch,NULL,NULL,TO_CHAR);
		REMOVE_BIT(ch->loc_hp[LOC_LEG_L],LOST_LEG);
		REMOVE_BIT(ch->loc_hp[LOC_LEG_L],BROKEN_LEG);
		SET_BIT(ch->loc_hp[LOC_LEG_L],LOST_FOOT);
	}
	else if (IS_LEG_R(ch,LOST_LEG))
	{
		act("A leg grows from the bloody stump of $n's right hip.",ch,NULL,NULL,TO_ROOM);
		act("A leg grows from the bloody stump of your right hip.",ch,NULL,NULL,TO_CHAR);
		REMOVE_BIT(ch->loc_hp[LOC_LEG_R],LOST_LEG);
		REMOVE_BIT(ch->loc_hp[LOC_LEG_R],BROKEN_LEG);
		SET_BIT(ch->loc_hp[LOC_LEG_R],LOST_FOOT);
	}
	else if (IS_ARM_L(ch,BROKEN_ARM))
	{
		act("$n's left arm snaps back into place.",ch,NULL,NULL,TO_ROOM);
		act("Your left arm snaps back into place.",ch,NULL,NULL,TO_CHAR);
		REMOVE_BIT(ch->loc_hp[LOC_ARM_L],BROKEN_ARM);
	}
	else if (IS_ARM_R(ch,BROKEN_ARM))
	{
		act("$n's right arm snaps back into place.",ch,NULL,NULL,TO_ROOM);
		act("Your right arm snaps back into place.",ch,NULL,NULL,TO_CHAR);
		REMOVE_BIT(ch->loc_hp[LOC_ARM_R],BROKEN_ARM);
	}
	else if (IS_LEG_L(ch,BROKEN_LEG))
	{
		act("$n's left leg snaps back into place.",ch,NULL,NULL,TO_ROOM);
		act("Your left leg snaps back into place.",ch,NULL,NULL,TO_CHAR);
		REMOVE_BIT(ch->loc_hp[LOC_LEG_L],BROKEN_LEG);
	}
	else if (IS_LEG_R(ch,BROKEN_LEG))
	{
		act("$n's right leg snaps back into place.",ch,NULL,NULL,TO_ROOM);
		act("Your right leg snaps back into place.",ch,NULL,NULL,TO_CHAR);
		REMOVE_BIT(ch->loc_hp[LOC_LEG_R],BROKEN_LEG);
	}
	else if (IS_ARM_L(ch,LOST_HAND))
	{
		act("A hand grows from the bloody stump of $n's left wrist.",ch,NULL,NULL,TO_ROOM);
		act("A hand grows from the bloody stump of your left wrist.",ch,NULL,NULL,TO_CHAR);
		REMOVE_BIT(ch->loc_hp[LOC_ARM_L],LOST_HAND);
		SET_BIT(ch->loc_hp[LOC_ARM_L],LOST_THUMB);
		SET_BIT(ch->loc_hp[LOC_ARM_L],LOST_FINGER_I);
		SET_BIT(ch->loc_hp[LOC_ARM_L],LOST_FINGER_M);
		SET_BIT(ch->loc_hp[LOC_ARM_L],LOST_FINGER_R);
		SET_BIT(ch->loc_hp[LOC_ARM_L],LOST_FINGER_L);
	}
	else if (IS_ARM_R(ch,LOST_HAND))
	{
		act("A hand grows from the bloody stump of $n's right wrist.",ch,NULL,NULL,TO_ROOM);
		act("A hand grows from the bloody stump of your right wrist.",ch,NULL,NULL,TO_CHAR);
		REMOVE_BIT(ch->loc_hp[LOC_ARM_R],LOST_HAND);
		SET_BIT(ch->loc_hp[LOC_ARM_R],LOST_THUMB);
		SET_BIT(ch->loc_hp[LOC_ARM_R],LOST_FINGER_I);
		SET_BIT(ch->loc_hp[LOC_ARM_R],LOST_FINGER_M);
		SET_BIT(ch->loc_hp[LOC_ARM_R],LOST_FINGER_R);
		SET_BIT(ch->loc_hp[LOC_ARM_R],LOST_FINGER_L);
	}
	else if (IS_LEG_L(ch,LOST_FOOT))
	{
		act("A foot grows from the bloody stump of $n's left ankle.",ch,NULL,NULL,TO_ROOM);
		act("A foot grows from the bloody stump of your left ankle.",ch,NULL,NULL,TO_CHAR);
		REMOVE_BIT(ch->loc_hp[LOC_LEG_L],LOST_FOOT);
	}
	else if (IS_LEG_R(ch,LOST_FOOT))
	{
		act("A foot grows from the bloody stump of $n's right ankle.",ch,NULL,NULL,TO_ROOM);
		act("A foot grows from the bloody stump of your right ankle.",ch,NULL,NULL,TO_CHAR);
		REMOVE_BIT(ch->loc_hp[LOC_LEG_R],LOST_FOOT);
	}
	else if (IS_ARM_L(ch,LOST_THUMB))
	{
		act("A thumb slides out of $n's bloody left hand.",ch,NULL,NULL,TO_ROOM);
		act("A thumb slides out of your bloody left hand.",ch,NULL,NULL,TO_CHAR);
		REMOVE_BIT(ch->loc_hp[LOC_ARM_L],LOST_THUMB);
		REMOVE_BIT(ch->loc_hp[LOC_ARM_L],BROKEN_THUMB);
	}
	else if (IS_ARM_L(ch,BROKEN_THUMB))
	{
		act("$n's left thumb snaps back into place.",ch,NULL,NULL,TO_ROOM);
		act("Your left thumb snaps back into place.",ch,NULL,NULL,TO_CHAR);
		REMOVE_BIT(ch->loc_hp[LOC_ARM_L],BROKEN_THUMB);
	}
	else if (IS_ARM_L(ch,LOST_FINGER_I))
	{
		act("An index finger slides out of $n's bloody left hand.",ch,NULL,NULL,TO_ROOM);
		act("An index finger slides out of your bloody left hand.",ch,NULL,NULL,TO_CHAR);
		REMOVE_BIT(ch->loc_hp[LOC_ARM_L],LOST_FINGER_I);
		REMOVE_BIT(ch->loc_hp[LOC_ARM_L],BROKEN_FINGER_I);
	}
	else if (IS_ARM_L(ch,BROKEN_FINGER_I))
	{
		act("$n's left index finger snaps back into place.",ch,NULL,NULL,TO_ROOM);
		act("Your left index finger snaps back into place.",ch,NULL,NULL,TO_CHAR);
		REMOVE_BIT(ch->loc_hp[LOC_ARM_L],BROKEN_FINGER_I);
	}
	else if (IS_ARM_L(ch,LOST_FINGER_M))
	{
		act("A middle finger slides out of $n's bloody left hand.",ch,NULL,NULL,TO_ROOM);
		act("A middle finger slides out of your bloody left hand.",ch,NULL,NULL,TO_CHAR);
		REMOVE_BIT(ch->loc_hp[LOC_ARM_L],LOST_FINGER_M);
		REMOVE_BIT(ch->loc_hp[LOC_ARM_L],BROKEN_FINGER_M);
	}
	else if (IS_ARM_L(ch,BROKEN_FINGER_M))
	{
		act("$n's left middle finger snaps back into place.",ch,NULL,NULL,TO_ROOM);
		act("Your left middle finger snaps back into place.",ch,NULL,NULL,TO_CHAR);
		REMOVE_BIT(ch->loc_hp[LOC_ARM_L],BROKEN_FINGER_M);
	}
	else if (IS_ARM_L(ch,LOST_FINGER_R))
	{
		act("A ring finger slides out of $n's bloody left hand.",ch,NULL,NULL,TO_ROOM);
		act("A ring finger slides out of your bloody left hand.",ch,NULL,NULL,TO_CHAR);
		REMOVE_BIT(ch->loc_hp[LOC_ARM_L],LOST_FINGER_R);
		REMOVE_BIT(ch->loc_hp[LOC_ARM_L],BROKEN_FINGER_R);
	}
	else if (IS_ARM_L(ch,BROKEN_FINGER_R))
	{
		act("$n's left ring finger snaps back into place.",ch,NULL,NULL,TO_ROOM);
		act("Your left ring finger snaps back into place.",ch,NULL,NULL,TO_CHAR);
		REMOVE_BIT(ch->loc_hp[LOC_ARM_L],BROKEN_FINGER_R);
	}
	else if (IS_ARM_L(ch,LOST_FINGER_L))
	{
		act("A little finger slides out of $n's bloody left hand.",ch,NULL,NULL,TO_ROOM);
		act("A little finger slides out of your bloody left hand.",ch,NULL,NULL,TO_CHAR);
		REMOVE_BIT(ch->loc_hp[LOC_ARM_L],LOST_FINGER_L);
		REMOVE_BIT(ch->loc_hp[LOC_ARM_L],BROKEN_FINGER_L);
	}
	else if (IS_ARM_L(ch,BROKEN_FINGER_L))
	{
		act("$n's left little finger snaps back into place.",ch,NULL,NULL,TO_ROOM);
		act("Your left little finger snaps back into place.",ch,NULL,NULL,TO_CHAR);
		REMOVE_BIT(ch->loc_hp[LOC_ARM_L],BROKEN_FINGER_L);
	}
	else if (IS_ARM_R(ch,LOST_THUMB))
	{
		act("A thumb slides out of $n's bloody right hand.",ch,NULL,NULL,TO_ROOM);
		act("A thumb slides out of your bloody right hand.",ch,NULL,NULL,TO_CHAR);
		REMOVE_BIT(ch->loc_hp[LOC_ARM_R],LOST_THUMB);
		REMOVE_BIT(ch->loc_hp[LOC_ARM_R],BROKEN_THUMB);
	}
	else if (IS_ARM_R(ch,BROKEN_THUMB))
	{
		act("$n's right thumb snaps back into place.",ch,NULL,NULL,TO_ROOM);
		act("Your right thumb snaps back into place.",ch,NULL,NULL,TO_CHAR);
		REMOVE_BIT(ch->loc_hp[LOC_ARM_R],BROKEN_THUMB);
	}
	else if (IS_ARM_R(ch,LOST_FINGER_I))
	{
		act("An index finger slides out of $n's bloody right hand.",ch,NULL,NULL,TO_ROOM);
		act("An index finger slides out of your bloody right hand.",ch,NULL,NULL,TO_CHAR);
		REMOVE_BIT(ch->loc_hp[LOC_ARM_R],LOST_FINGER_I);
		REMOVE_BIT(ch->loc_hp[LOC_ARM_R],BROKEN_FINGER_I);
	}
	else if (IS_ARM_R(ch,BROKEN_FINGER_I))
	{
		act("$n's right index finger snaps back into place.",ch,NULL,NULL,TO_ROOM);
		act("Your right index finger snaps back into place.",ch,NULL,NULL,TO_CHAR);
		REMOVE_BIT(ch->loc_hp[LOC_ARM_R],BROKEN_FINGER_I);
	}
	else if (IS_ARM_R(ch,LOST_FINGER_M))
	{
		act("A middle finger slides out of $n's bloody right hand.",ch,NULL,NULL,TO_ROOM);
		act("A middle finger slides out of your bloody right hand.",ch,NULL,NULL,TO_CHAR);
		REMOVE_BIT(ch->loc_hp[LOC_ARM_R],LOST_FINGER_M);
		REMOVE_BIT(ch->loc_hp[LOC_ARM_R],BROKEN_FINGER_M);
	}
	else if (IS_ARM_R(ch,BROKEN_FINGER_M))
	{
		act("$n's right middle finger snaps back into place.",ch,NULL,NULL,TO_ROOM);
		act("Your right middle finger snaps back into place.",ch,NULL,NULL,TO_CHAR);
		REMOVE_BIT(ch->loc_hp[LOC_ARM_R],BROKEN_FINGER_M);
	}
	else if (IS_ARM_R(ch,LOST_FINGER_R))
	{
		act("A ring finger slides out of $n's bloody right hand.",ch,NULL,NULL,TO_ROOM);
		act("A ring finger slides out of your bloody right hand.",ch,NULL,NULL,TO_CHAR);
		REMOVE_BIT(ch->loc_hp[LOC_ARM_R],LOST_FINGER_R);
		REMOVE_BIT(ch->loc_hp[LOC_ARM_R],BROKEN_FINGER_R);
	}
	else if (IS_ARM_R(ch,BROKEN_FINGER_R))
	{
		act("$n's right ring finger snaps back into place.",ch,NULL,NULL,TO_ROOM);
		act("Your right ring finger snaps back into place.",ch,NULL,NULL,TO_CHAR);
		REMOVE_BIT(ch->loc_hp[LOC_ARM_R],BROKEN_FINGER_R);
	}
	else if ( IS_ARM_R(ch,LOST_FINGER_L))
	{
		act("A little finger slides out of $n's bloody right hand.",ch,NULL,NULL,TO_ROOM);
		act("A little finger slides out of your bloody right hand.",ch,NULL,NULL,TO_CHAR);
		REMOVE_BIT(ch->loc_hp[LOC_ARM_R],LOST_FINGER_L);
		REMOVE_BIT(ch->loc_hp[LOC_ARM_R],BROKEN_FINGER_L);
	}
	else if ( IS_ARM_R(ch,BROKEN_FINGER_L))
	{
		act("$n's right little finger snaps back into place.",ch,NULL,NULL,TO_ROOM);
		act("Your right little finger snaps back into place.",ch,NULL,NULL,TO_CHAR);
		REMOVE_BIT(ch->loc_hp[LOC_ARM_R],BROKEN_FINGER_L);
	}
	else if (IS_BODY(ch,CUT_THROAT))
	{
		if (IS_SET(ch->loc_hp[6], BLEEDING_THROAT)) return;
		act("The wound in $n's throat closes up.",ch,NULL,NULL,TO_ROOM);
		act("The wound in your throat closes up.",ch,NULL,NULL,TO_CHAR);
		REMOVE_BIT(ch->loc_hp[LOC_BODY],CUT_THROAT);
	}
	return;
}

void vamp_rage( CHAR_DATA *ch )
{
	if (IS_NPC(ch)) return;
	
	send_to_char("You scream with rage as the beast within consumes you!\n\r",ch);
	act("$n screams with rage as $s inner beast consumes $m!.", ch, NULL, NULL, TO_ROOM);
	do_beastlike(ch,"");
	power_rage(ch,ch,"");
	return;
}

void do_humanity( CHAR_DATA *ch, char *argument )
{
	char       arg [MAX_INPUT_LENGTH];
	
	argument = one_argument( argument, arg );
	
	if (IS_NPC( ch )) return;
	if (!IS_NPC( ch )) return; /* need to re-do beast */
	
	if (!IS_NPC(ch) && IS_CLASS(ch,CLASS_VAMPIRE) && ch->beast > 0
		&& ch->beast < 100 && number_range(1, 500) <= ch->beast)
	{
		if (ch->beast == 1)
		{
			send_to_char("You have attained Golconda!\n\r", ch);
			ch->exp += 1000000;
		}
		else
			send_to_char("You feel slightly more in control of your beast.\n\r", ch);
		ch->beast -= 1;
	}
	return;
}

void do_beastlike( CHAR_DATA *ch, char *argument )
{
	char       arg [MAX_INPUT_LENGTH];
	int blood;
	
	argument = one_argument( argument, arg );
	
	if (IS_NPC( ch )) return;
	if (!IS_NPC( ch )) return; /* need to re-do beast */
	
	if (!IS_NPC(ch) && IS_CLASS(ch,CLASS_VAMPIRE) && ch->beast < 100
		&& ch->beast > 0 && number_range(1, 500) <= ch->beast)
	{
		if (ch->beast < 99)
			send_to_char("You feel your beast take more control over your actions.\n\r", ch);
		else
			send_to_char("Your beast has fully taken over control of your actions!\n\r", ch);
		ch->beast += 1;
		blood = ch->pcdata->condition[COND_THIRST];
		ch->pcdata->condition[COND_THIRST] = 666;
		if ((get_disc(ch,DISC_PROTEAN) > 0 || (get_disc(ch,DISC_OBTENEBRATION) > 1))
			&& !IS_VAMPAFF(ch,VAM_NIGHTSIGHT) ) power_nightsight(ch,ch,"");
		if (!IS_VAMPAFF(ch,VAM_FANGS) ) power_fangs(ch,ch,"");
		if (get_disc(ch,DISC_PROTEAN) > 1 &&
			!IS_VAMPAFF(ch,VAM_CLAWS) ) power_claws(ch,ch,"");
		ch->pcdata->condition[COND_THIRST] = blood;
	}
	return;
}

void do_feed( CHAR_DATA *ch, char *argument )
{
	CHAR_DATA *victim;
	char      arg [MAX_INPUT_LENGTH];
	char      buf [MAX_INPUT_LENGTH];
	char      bufch [MAX_INPUT_LENGTH];
	char      bufvi [MAX_INPUT_LENGTH];
	int       blood;
	
	argument = one_argument( argument, arg );
	
	if (IS_NPC(ch)) return;
	if (!IS_CLASS(ch, CLASS_VAMPIRE))
	{
		send_to_char("Huh?\n\r",ch);
		return;
	}
	if ( ( victim = get_char_room( ch, arg ) ) == NULL )
	{
		send_to_char( "They aren't here.\n\r", ch );
		return;
	}
	if (IS_NPC(victim))
	{
		send_to_char("Not on NPC's.\n\r",ch);
		return;
	}
	if (!IS_CLASS(victim, CLASS_VAMPIRE))
	{
		send_to_char("Blood does them no good at all.\n\r",ch);
		return;
	}
	if (!IS_IMMUNE(victim, IMM_VAMPIRE))
	{
		send_to_char("They refuse to drink your blood.\n\r",ch);
		return;
	}
	if ( ch->pcdata->condition[COND_THIRST] < 20 )
	{
		send_to_char("You don't have enough blood.\n\r",ch);
		return;
	}
	
	blood = number_range(5,10);
	ch->pcdata->condition[COND_THIRST] -= (blood * 2);
	victim->pcdata->condition[COND_THIRST] += blood;
	
	if (IS_AFFECTED(ch,AFF_POLYMORPH)) sprintf(bufch,ch->morph->str);
	else sprintf(bufch,ch->name->str);
	if (IS_AFFECTED(victim,AFF_POLYMORPH)) sprintf(bufvi,victim->morph->str);
	else sprintf(bufvi,victim->name->str);
	sprintf(buf,"You tear open your wrist and feed some blood to %s.",bufvi);
	act(buf,ch,NULL,victim,TO_CHAR);
	sprintf(buf,"%s tears open $s wrist and feeds some blood to %s.",bufch,bufvi);
	act(buf, ch, NULL, victim, TO_NOTVICT);
	if (victim->position < POS_RESTING)
		send_to_char("You feel some blood poured down your throat.\n\r",victim);
	else
	{
		sprintf(buf,"%s tears open $s wrist and feeds you some blood.",bufch);
		act(buf, ch, NULL, victim, TO_VICT);
	}
	return;
}

void do_upkeep( CHAR_DATA *ch, char *argument )
{
	char      arg [MAX_INPUT_LENGTH];
	char      buf [MAX_INPUT_LENGTH];
	GString *output;
	char      buf2 [MAX_INPUT_LENGTH];
	int	  SnoopCount = 0;

	argument = one_argument( argument, arg );

	if (IS_NPC(ch)) return;
	if (IS_SWWF(ch))
	{
		send_to_char("--------------------------------------------------------\n\r",ch);
		send_to_char("               -= Werewolf upkeep =-\n\r",ch);
		send_to_char("--------------------------------------------------------\n\r",ch);
		send_to_char("     1  Staying alive.\n\r",ch);

		if (IS_SET(ch->act,PLR_WIZINVIS ) )
			send_to_char("    5  Blur.\n\r",ch); 

		if (IS_VAMPAFF(ch,VAM_CLAWS) )
		{
			sprintf(buf,"  1- 3  Claws out.\n\r");
			send_to_char(buf,ch);
		}

		if (ch->pcdata->wwf_shape == SHAPE_CRINOS  && ch->pcdata->sgift[1] != BREED_METIS)
			send_to_char("    5  Crinos form.\n\r",ch); 

		if (ch->pcdata->wwf_shape == SHAPE_GLABRO)
			send_to_char("    3  Glabro form.\n\r",ch); 

		if (ch->pcdata->wwf_shape == SHAPE_HISPO)
			send_to_char("    3  Hispo form.\n\r",ch); 

		if (IS_ADDED(ch,ADDED_BRISTLES) )
			send_to_char(" 1- 3  Bristles\n\r",ch); 
		if (IS_AFFECTED(ch, AFF_HIDE))
			send_to_char(" 1- 7  Hide.\n\r",ch); 
		if (IS_ITEMAFF(ch,ITEMA_SUNSHIELD) )
			send_to_char(" 1- 7  Sunshield.\n\r",ch); 
		if (IS_ADDED(ch,ADDED_ANIMAL_MASTER) )
			send_to_char(" 1- 5  Animal Master.\n\r",ch); 
		if ( ( ( ch->hit - ch->pcdata->absorb[ABS_MOB_HP] ) < 1 ) || 
				( ( ch->max_hit - ch->pcdata->absorb[ABS_MOB_MAX_HP]) < 1 ) )
			send_to_char(" 5-15  Absorbing.\n\r",ch); 
		if (IS_ADDED(ch,ADDED_HAND_FLAME) )
			send_to_char(" 1- 5  Flaming Hand.\n\r",ch); 

	}
	else if (IS_CLASS(ch, CLASS_VAMPIRE))
	{
		send_to_char("--------------------------------------------------------\n\r",ch);
		send_to_char("               -= Vampire upkeep =-\n\r",ch);
		send_to_char("--------------------------------------------------------\n\r",ch);
		send_to_char("     1  Staying alive.\n\r",ch);

		if (IS_VAMPAFF(ch,VAM_DISGUISED) )
		{
			if      (ch->beast == 0  ) sprintf(buf,"     0  Disguised as %s.\n\r",ch->morph->str);
			else if (ch->beast == 100) sprintf(buf," 10-20  Disguised as %s.\n\r",ch->morph->str);
			else sprintf(buf,"  5-10  Disguised as %s.\n\r",ch->morph->str);
			send_to_char(buf,ch);
		}
		if (IS_IMMUNE(ch,IMM_SHIELDED) )
		{
			if      (ch->beast == 0  ) sprintf(buf,"     0  Shield.\n\r");
			else if (ch->beast == 100) sprintf(buf,"  2- 6  Shield.\n\r");
			else sprintf(buf,"  1- 3  Shield.\n\r");
			send_to_char(buf,ch);
		}
		if (IS_AFFECTED(ch,AFF_DISEASE ) )
			send_to_char("    10  Disease.\n\r",ch); 

		/*
		 * Unveil Cost for vampires per Tick
		 */
		SnoopCount = count_snoopers(ch->desc); 
		if ( SnoopCount > 0)
		{
			SnoopCount *= 10;
			output = g_string_new("");
			g_string_sprintf(output,"    %2d  Unveil\n\r", SnoopCount);
			send_to_char(output->str,ch);
			g_string_free(output,TRUE);
		}

		if (IS_ADDED(ch,ADDED_DISCERN ) )
			send_to_char("    30  Whispers.\n\r",ch); 

		if (IS_SET(ch->act,PLR_MARBLEFLESH ) )
			send_to_char("     2  Marbled Flesh.\n\r",ch); 

		if (IS_SET(ch->added,ADDED_NIGHTFALL ) )
			send_to_char("     5  Nightfall.\n\r",ch); 

		if (IS_SET(ch->act,PLR_WIZINVIS ) )
			send_to_char("     5  Vanish.\n\r",ch); 

		if (IS_SET(ch->added,ADDED_CLOAK ) )
			send_to_char("  5-10  Equipment vanished.\n\r",ch); 

		if (IS_AFFECTED(ch,AFF_AGGDAM ) )
			send_to_char("     0  Aggravated wounds.\n\r",ch); 

		if (IS_VAMPAFF(ch,VAM_FANGS) )
		{
			if      (ch->beast == 0  ) sprintf(buf,"     0  Fangs out.\n\r");
			else if (ch->beast == 100) sprintf(buf,"     2  Fangs out.\n\r");
			else sprintf(buf,"     1  Fangs out.\n\r");
			send_to_char(buf,ch);
		}
		if (IS_VAMPAFF(ch,VAM_CLAWS) )
		{
			if      (ch->beast == 0  ) sprintf(buf,"     0  Claws out.\n\r");
			else if (ch->beast == 100) sprintf(buf,"  2- 6  Claws out.\n\r");
			else sprintf(buf,"  1- 3  Claws out.\n\r");
			send_to_char(buf,ch);
		}
		if (IS_VAMPAFF(ch,VAM_NIGHTSIGHT) )
		{
			if      (ch->beast == 0  ) sprintf(buf,"     0  Nightsight.\n\r");
			else if (ch->beast == 100) sprintf(buf,"     2  Nightsight.\n\r");
			else sprintf(buf,"     1  Nightsight.\n\r");
			send_to_char(buf,ch);
		}
		if (IS_SET(ch->act,PLR_HOLYLIGHT) )
		{
			if      (ch->beast == 0  ) sprintf(buf,"     0  Truesight.\n\r");
			else if (ch->beast == 100) sprintf(buf,"  2-10  Truesight.\n\r");
			else sprintf(buf,"  1- 5  Truesight.\n\r");
			send_to_char(buf,ch);
		}
		if (IS_VAMPAFF(ch,VAM_CHANGED) )
		{
			if      (IS_POLYAFF(ch,POLY_BAT))  sprintf(buf2,"bat" );
			else if (IS_POLYAFF(ch,POLY_WOLF)) sprintf(buf2,"wolf");
			else if (IS_POLYAFF(ch,POLY_ZULO)) sprintf(buf2,"horrid");
			else if (IS_POLYAFF(ch,POLY_CHANGELING)) sprintf(buf2,"changeling");
			else if (IS_POLYAFF(ch,POLY_BONECRAFT)) sprintf(buf2,"bonecraft");
			else                               sprintf(buf2,"mist");
			if      (ch->beast == 0  ) sprintf(buf,"     0  Changed into %s form.\n\r",buf2);
			else if (ch->beast == 100) sprintf(buf," 10-20  Changed into %s form.\n\r",buf2);
			else sprintf(buf,"  5-10  Changed into %s form.\n\r",buf2);
			send_to_char(buf,ch);
		}
		if (IS_SET(ch->sight, SIGHT_SPIRIT)){
			send_to_char("     1  Spirit Sight.\n\r",ch); 
		}
		if (IS_POLYAFF(ch,POLY_SERPENT) )
		{
			if      (ch->beast == 0  ) sprintf(buf,"     0  Serpent form.\n\r");
			else if (ch->beast == 100) sprintf(buf,"  6- 8  Serpent form.\n\r");
			else sprintf(buf,"  1- 3  Serpent form.\n\r");
			send_to_char(buf,ch);
		}
	}
	else
	{
		send_to_char("Huh?\n\r",ch);
		return;
	}
	send_to_char("--------------------------------------------------------\n\r",ch);
	return;
}

void do_vclan( CHAR_DATA *ch, char *argument )
{
	char buf[MAX_STRING_LENGTH];
	char arg[MAX_INPUT_LENGTH];
	CHAR_DATA *gch;
	
	one_argument( argument, arg );
	
	if (IS_NPC(ch)) return;
	if (!IS_CLASS(ch, CLASS_VAMPIRE) )
	{
		send_to_char("Huh?\n\r",ch);
		return;
	}
	
	if (ch->clan == CLAN_NONE || IS_SET(ch->special, SPC_ANARCH) )
	{
		send_to_char("But you don't belong to any clan!\n\r",ch);
		return;
	}
	
	sprintf( buf, "The %s clan:\n\r", iclan_table[ch->clan].pretty_name );
	send_to_char( buf, ch );
	send_to_char("[      Name      ] [ Gen ] [Blood]\n\r", ch );
	for ( gch = char_list; gch != NULL; gch = gch->next )
	{
		if ( IS_NPC(gch) ) continue;
		if ( !IS_CLASS(gch, CLASS_VAMPIRE) ) continue;
		if ( ch->clan == gch->clan )
		{
			sprintf( buf,
				"[%-16s] [  %d  ] [ %3d ]\n\r",
				capitalize( gch->name->str ),
				gch->pcdata->stats[UNI_GEN],
				gch->pcdata->condition[COND_THIRST] );
			send_to_char( buf, ch );
		}
	}
	mudsetting->last_proc_logged = 20;
	return;
}

void do_tribe( CHAR_DATA *ch, char *argument )
{
	char buf[MAX_STRING_LENGTH];
	char arg[MAX_INPUT_LENGTH];
	char clan[MAX_INPUT_LENGTH];
	CHAR_DATA *gch;
	
	one_argument( argument, arg );
	
	if (IS_NPC(ch)) return;
	if (!IS_CLASS(ch, CLASS_WEREWOLF) && !IS_SWWF(ch))
	{
		send_to_char("Huh?\n\r",ch);
		return;
	}
	if ( ch->sect == SECT_WYRM )
	{
		send_to_char("You need no tribe, foul spawn of the wyrm.\n\r",ch);
		return;
	}
	send_to_char("[      Name      ] [    Tribe    ]\n\r", ch );
	for ( gch = char_list; gch != NULL; gch = gch->next )
	{
		if ( IS_NPC(gch) ) continue;
		if ( !IS_CLASS(gch, CLASS_WEREWOLF) && !IS_SWWF(gch) ) continue;
		if ( IS_IMMORTAL(gch) ) continue;
		if ( gch->sect == SECT_WYRM) continue;
		if ( gch->clan != CLAN_NONE && gch->clan != CLAN_RONIN )
			sprintf(clan,iclan_table[gch->clan].pretty_name);
		else if ( gch->pcdata->stats[UNI_GEN] == 1 )
			sprintf(clan,"All");
		else
			sprintf(clan,"None");
		{
			sprintf( buf,
				"[%-16s] [%-13s]\n\r",
				capitalize( gch->name->str ), iclan_table[gch->clan].pretty_name);
			send_to_char( buf, ch );
		}
	}
	mudsetting->last_proc_logged = 21;
	return;
}


void do_werewolf( CHAR_DATA *ch, char *argument )
{
	char       buf[MAX_INPUT_LENGTH];
	char       arg[MAX_INPUT_LENGTH];
	CHAR_DATA *vch;
	CHAR_DATA *vch_next;
	OBJ_DATA  *obj;
	
	argument = one_argument( argument, arg );
	
	if (IS_NPC(ch)) return;
	if (!IS_CLASS(ch, CLASS_WEREWOLF)) return;
	if (IS_SET(ch->special, SPC_WOLFMAN)) return;
	SET_BIT(ch->special, SPC_WOLFMAN);
	
	send_to_char("You throw back your head and howl with rage!\n\r",ch);
	act("$n throws back $s head and howls with rage!.", ch, NULL, NULL, TO_ROOM);
	send_to_char("Coarse dark hair sprouts from your body.\n\r",ch);
	act("Coarse dark hair sprouts from $n's body.",ch,NULL,NULL,TO_ROOM);

    if (!IS_VAMPAFF(ch,VAM_NIGHTSIGHT))
	{
		send_to_char("Your eyes start glowing red.\n\r",ch);
		act("$n's eyes start glowing red.",ch,NULL,NULL,TO_ROOM);
		SET_BIT(ch->pcdata->stats[UNI_AFF], VAM_NIGHTSIGHT);
	}
	if (!IS_VAMPAFF(ch,VAM_FANGS))
	{
		send_to_char("A pair of long fangs extend from your mouth.\n\r",ch);
		act("A pair of long fangs extend from $n's mouth.",ch,NULL,NULL,TO_ROOM);
		SET_BIT(ch->pcdata->stats[UNI_AFF], VAM_FANGS);
	}
	if (!IS_VAMPAFF(ch,VAM_CLAWS))
	{
		send_to_char("Razor sharp talons extend from your fingers.\n\r",ch);
		act("Razor sharp talons extend from $n's fingers.",ch,NULL,NULL,TO_ROOM);
		SET_BIT(ch->pcdata->stats[UNI_AFF], VAM_CLAWS);
	}
	if ((obj = get_eq_char(ch,WEAR_WIELD)) != NULL && !IS_SET(obj->spectype, SITEM_WOLFWEAPON))
	{
		act("$p drops from your right hand.",ch,obj,NULL,TO_CHAR);
		act("$p drops from $n's right hand.",ch,obj,NULL,TO_ROOM);
		obj_from_char(obj);
		obj_to_char(obj, ch);
	}
	if ((obj = get_eq_char(ch,WEAR_HOLD)) != NULL && !IS_SET(obj->spectype, SITEM_WOLFWEAPON))
	{
		act("$p drops from your left hand.",ch,obj,NULL,TO_CHAR);
		act("$p drops from $n's left hand.",ch,obj,NULL,TO_ROOM);
		obj_from_char(obj);
		obj_to_char(obj, ch);
	}
	SET_BIT(ch->affected_by, AFF_POLYMORPH);
	SET_BIT(ch->pcdata->stats[UNI_AFF], VAM_DISGUISED);
	sprintf(buf,"%s the werewolf",ch->name->str);
	ch->morph = g_string_assign(ch->morph,buf);
	ch->pcdata->stats[UNI_RAGE] += 25;
	if (ch->pcdata->powers[WPOWER_WOLF] > 3) ch->pcdata->stats[UNI_RAGE] += 100;
	if (ch->pcdata->stats[UNI_RAGE] > 400) 
		ch->pcdata->stats[UNI_RAGE] = 400;
	
	for ( vch = char_list; vch != NULL; vch = vch_next )
	{
		vch_next	= vch->next;
		if ( vch->in_room == NULL )
			continue;
		if ( ch == vch )
		{
			act("You throw back your head and howl with rage!", ch, NULL, NULL, TO_CHAR);
			continue;
		}
		if ( !IS_NPC(vch) && vch->pcdata->chobj != NULL )
			continue;
		if (!IS_NPC(vch))
		{
			if (vch->in_room == ch->in_room)
				act("$n throws back $s head and howls with rage!", ch, NULL, vch, TO_VICT);
			else if (vch->in_room->area == ch->in_room->area)
				send_to_char("You hear a fearsome howl close by!\n\r", vch);
			else
/*		send_to_char("You hear a fearsome howl far off in the 
		distance!\n\r", vch);*/
				if (!CAN_PK(vch)) continue;
		}
		if ( vch->in_room == ch->in_room && can_see( ch, vch) )
		{
			if ( check_pk(ch,vch,CHECK_DELAY|CHECK_ATTACK))
				return;
			set_attack_flag(ch,vch);
			multi_hit( ch, vch, TYPE_UNDEFINED );
			if (vch == NULL || vch->position <= POS_STUNNED) continue;
			multi_hit( ch, vch, TYPE_UNDEFINED );
			if (vch == NULL || vch->position <= POS_STUNNED) continue;
			multi_hit( ch, vch, TYPE_UNDEFINED );
		}
	}
	mudsetting->last_proc_logged = 22;
	return;
}

void do_unwerewolf( CHAR_DATA *ch, char *argument )
{
	char       arg[MAX_INPUT_LENGTH];
	
	argument = one_argument( argument, arg );
	
	if (IS_NPC(ch)) return;
	if (!IS_CLASS(ch, CLASS_WEREWOLF)) return;
	if (!IS_SET(ch->special, SPC_WOLFMAN)) return;
	REMOVE_BIT(ch->special, SPC_WOLFMAN);
	REMOVE_BIT(ch->affected_by, AFF_POLYMORPH);
	REMOVE_BIT(ch->pcdata->stats[UNI_AFF], VAM_DISGUISED);
	ch->morph = g_string_assign(ch->morph,"");
	if (IS_VAMPAFF(ch,VAM_CLAWS))
	{
		send_to_char("Your talons slide back into your fingers.\n\r",ch);
		act("$n's talons slide back into $s fingers.",ch,NULL,NULL,TO_ROOM);
		REMOVE_BIT(ch->pcdata->stats[UNI_AFF], VAM_CLAWS);
	}
	if (IS_VAMPAFF(ch,VAM_FANGS))
	{
		send_to_char("Your fangs slide back into your mouth.\n\r",ch);
		act("$n's fangs slide back into $s mouth.",ch,NULL,NULL,TO_ROOM);
		REMOVE_BIT(ch->pcdata->stats[UNI_AFF], VAM_FANGS);
	}
	if (IS_VAMPAFF(ch,VAM_NIGHTSIGHT))
	{
		send_to_char("The red glow in your eyes fades.\n\r",ch);
		act("The red glow in $n's eyes fades.",ch,NULL,NULL,TO_ROOM);
		REMOVE_BIT(ch->pcdata->stats[UNI_AFF], VAM_NIGHTSIGHT);
	}
	send_to_char("Your coarse hair shrinks back into your body.\n\r",ch);
	act("$n's coarse hair shrinks back into $s body.",ch,NULL,NULL,TO_ROOM);
	ch->pcdata->stats[UNI_RAGE] -= 25;
	if (ch->pcdata->stats[UNI_RAGE] < 0) ch->pcdata->stats[UNI_RAGE] = 0;
	return;
}

void sabbat_fav( CHAR_DATA *ch, char *argument )
{
	CHAR_DATA *victim;
	char      arg1 [MAX_INPUT_LENGTH];
	char      arg2 [MAX_INPUT_LENGTH];
	
	argument = one_argument( argument, arg1 );
	argument = one_argument( argument, arg2 );

	if ( IS_NPC(ch) ) return;

	if ( !IS_CLASS(ch,CLASS_VAMPIRE) && (IS_SET(ch->special,SPC_PRINCE) || ch->pcdata->stats[UNI_GEN] != 2) )
	{
		send_to_char( "Huh?\n\r", ch );
		return;
	}
	
		if ( arg1[0] == '\0' || arg2[0] == '\0' )
	{
		
		send_to_char( "Syntax is: favour <target> <regent/cardinal/sire/priscus/seraph>\n\r", ch );
		return;
	}
	
	if ( ( victim = get_char_room( ch, arg1 ) ) == NULL )
	{
		send_to_char( "They aren't here.\n\r", ch );
		return;
	}
	
	if ( IS_NPC(victim) )
	{
		send_to_char( "Not on NPC's.\n\r", ch );
		return;
	}
	
	if ( ch == victim )
	{
		send_to_char( "Not on yourself!\n\r", ch );
		return;
	}
	
	if ( !IS_CLASS(victim,CLASS_VAMPIRE) )
	{
		send_to_char( "But they are not a vampire!\n\r", ch );
		return;
	}
	
	if ( (victim->sect != ch->sect && str_cmp(arg2,"induct")) )
	{
		send_to_char( "You can only grant your favour to someone in your sect!\n\r", ch );
		return;
	}
	
	if ( (ch->pcdata->stats[UNI_GEN] > victim->pcdata->stats[UNI_GEN])  )
	{
		send_to_char( "You can only grant your favour to someone of a lower generation.\n\r", ch );
		return;
	}
	
	if ( !str_cmp(arg2,"regent") && ((ch->pcdata->stats[UNI_GEN] == 2)) )
	{
		if (IS_SET(victim->special,SPC_PRINCE)) {
			act("You remove $N's regent privilages!",ch,NULL,victim,TO_CHAR);
			act("$n removes $N's regent privilages!",ch,NULL,victim,TO_NOTVICT);
			act("$n removes your regent privilages!",ch,NULL,victim,TO_VICT);
			if (IS_SET(victim->special,SPC_SIRE)) REMOVE_BIT(victim->special,SPC_SIRE);
		REMOVE_BIT(victim->special,SPC_PRINCE);return;}
		act("You make $N a regent!",ch,NULL,victim,TO_CHAR);
		act("$n has made $N a regent!",ch,NULL,victim,TO_NOTVICT);
		act("$n has made you a regent!",ch,NULL,victim,TO_VICT);
		SET_BIT(victim->special,SPC_PRINCE);
		if (IS_SET(victim->special,SPC_SIRE)) REMOVE_BIT(victim->special,SPC_SIRE);
		return;
	}
	else if ( !str_cmp(arg2,"sire") && (ch->pcdata->stats[UNI_GEN] == 2 || IS_SET(ch->special,SPC_PRINCE) ) )
	{
		if (IS_SET(victim->special,SPC_SIRE)) {
			act("You remove $N's permission to sire a childe!",ch,NULL,victim,TO_CHAR);
			act("$n has removed $N's permission to sire a childe!",ch,NULL,victim,TO_NOTVICT);
			act("$n has remove your permission to sire a childe!",ch,NULL,victim,TO_VICT);
		REMOVE_BIT(victim->special,SPC_SIRE);return;}
		act("You grant $N permission to sire a childe!",ch,NULL,victim,TO_CHAR);
		act("$n has granted $N permission to sire a childe!",ch,NULL,victim,TO_NOTVICT);
		act("$n has granted you permission to sire a childe!",ch,NULL,victim,TO_VICT);
		SET_BIT(victim->special,SPC_SIRE);
		return;
	}
	else if ( !str_cmp(arg2,"cardinal") && (ch->pcdata->stats[UNI_GEN] == 2 || IS_SET(ch->special,SPC_PRINCE)) )
	{
		if (IS_SET(victim->special,SPC_CARDINAL)) {
			act("You remove $N's cardinal status!",ch,NULL,victim,TO_CHAR);
			act("$n has removed $N's cardinal status!",ch,NULL,victim,TO_NOTVICT);
			act("$n has remove your cardinal status!",ch,NULL,victim,TO_VICT);
		REMOVE_BIT(victim->special,SPC_CARDINAL);return;}
		act("You grant $N cardinal status!",ch,NULL,victim,TO_CHAR);
		act("$n has granted $N cardinal status!",ch,NULL,victim,TO_NOTVICT);
		act("$n has granted you cardinal status!",ch,NULL,victim,TO_VICT);
		SET_BIT(victim->special,SPC_CARDINAL);
		return;
	}
	else if ( !str_cmp(arg2,"priscus") && (ch->pcdata->stats[UNI_GEN] == 2 || IS_SET(ch->special,SPC_PRINCE) ) )
	{
		if (IS_SET(victim->special,SPC_PRIMOGEN)) {
			act("You remove $N's priscus status!",ch,NULL,victim,TO_CHAR);
			act("$n has removed $N's priscus status!",ch,NULL,victim,TO_NOTVICT);
			act("$n has remove your priscus status!",ch,NULL,victim,TO_VICT);
		REMOVE_BIT(victim->special,SPC_PRIMOGEN);return;}
		act("You grant $N priscus status!",ch,NULL,victim,TO_CHAR);
		act("$n has granted $N priscus status!",ch,NULL,victim,TO_NOTVICT);
		act("$n has granted you priscus status!",ch,NULL,victim,TO_VICT);
		SET_BIT(victim->special,SPC_PRIMOGEN);
		return;
	}
	else if ( !str_cmp(arg2,"seraph") && (ch->pcdata->stats[UNI_GEN] == 2 || IS_SET(ch->special,SPC_PRINCE) ) )
	{
		if (IS_SET(victim->special,SPC_JUSTICAR)) {
			act("You remove $N's seraph status!",ch,NULL,victim,TO_CHAR);
			act("$n has removed $N's seraph status!",ch,NULL,victim,TO_NOTVICT);
			act("$n has remove your seraph status!",ch,NULL,victim,TO_VICT);
		REMOVE_BIT(victim->special,SPC_JUSTICAR);return;}
		act("You grant $N seraph status!",ch,NULL,victim,TO_CHAR);
		act("$n has granted $N seraph status!",ch,NULL,victim,TO_NOTVICT);
		act("$n has granted you seraph status!",ch,NULL,victim,TO_VICT);
		SET_BIT(victim->special,SPC_JUSTICAR);
		return;
	}

 else send_to_char( "You are unable to grant that sort of favour.\n\r", ch );
	return;
}


void do_favour( CHAR_DATA *ch, char *argument )
{
	CHAR_DATA *victim;
	char      arg1 [MAX_INPUT_LENGTH];
	char      arg2 [MAX_INPUT_LENGTH];
	
	if (IS_SABBAT(ch))
	{
		sabbat_fav(ch,argument);
		return;
	}

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

	if ( IS_NPC(ch) ) return;

	if ( !IS_CLASS(ch,CLASS_VAMPIRE) && (IS_SET(ch->special,SPC_PRINCE) || ch->pcdata->stats[UNI_GEN] != 2) )
	{
		send_to_char( "Huh?\n\r", ch );
		return;
	}
	
		if ( arg1[0] == '\0' || arg2[0] == '\0' )
	{
		
		send_to_char( "Syntax is: favour <target> <prince/sire/primogen/justicar>\n\r", ch );
		return;
	}
	
	if ( ( victim = get_char_room( ch, arg1 ) ) == NULL )
	{
		send_to_char( "They aren't here.\n\r", ch );
		return;
	}
	
	if ( IS_NPC(victim) )
	{
		send_to_char( "Not on NPC's.\n\r", ch );
		return;
	}
	
	if ( ch == victim )
	{
		send_to_char( "Not on yourself!\n\r", ch );
		return;
	}
	
	if ( !IS_CLASS(victim,CLASS_VAMPIRE) )
	{
		send_to_char( "But they are not a vampire!\n\r", ch );
		return;
	}
	
	if ( (victim->sect != ch->sect && str_cmp(arg2,"induct")) && str_cmp(ch->name->str,"Dominion"))
	{
		send_to_char( "You can only grant your favour to someone in your sect!\n\r", ch );
		return;
	}
	
	if ( (ch->pcdata->stats[UNI_GEN] > victim->pcdata->stats[UNI_GEN])  && str_cmp(ch->name->str,"Dominion") )
	{
		send_to_char( "You can only grant your favour to someone of a lower generation.\n\r", ch );
		return;
	}
	
	if ( !str_cmp(arg2,"prince") && ((ch->pcdata->stats[UNI_GEN] == 2) || !str_cmp(ch->name->str,"Dominion")) )
	{
		if (IS_SET(victim->special,SPC_PRINCE)) {
			act("You remove $N's prince privilages!",ch,NULL,victim,TO_CHAR);
			act("$n removes $N's prince privilages!",ch,NULL,victim,TO_NOTVICT);
			act("$n removes your prince privilages!",ch,NULL,victim,TO_VICT);
			if (IS_SET(victim->special,SPC_SIRE)) REMOVE_BIT(victim->special,SPC_SIRE);
		REMOVE_BIT(victim->special,SPC_PRINCE);return;}
		act("You make $N a prince!",ch,NULL,victim,TO_CHAR);
		act("$n has made $N a prince!",ch,NULL,victim,TO_NOTVICT);
		act("$n has made you a prince!",ch,NULL,victim,TO_VICT);
		SET_BIT(victim->special,SPC_PRINCE);
		if (IS_SET(victim->special,SPC_SIRE)) REMOVE_BIT(victim->special,SPC_SIRE);
		return;
	}
	else if ( !str_cmp(arg2,"sire") && (ch->pcdata->stats[UNI_GEN] == 2 || IS_SET(ch->special,SPC_PRINCE) || !str_cmp(ch->name->str,"Dominion")) )
	{
		if (IS_SET(victim->special,SPC_SIRE)) 
		{
			act("You remove $N's permission to sire a childe!",ch,NULL,victim,TO_CHAR);
			act("$n has removed $N's permission to sire a childe!",ch,NULL,victim,TO_NOTVICT);
			act("$n has remove your permission to sire a childe!",ch,NULL,victim,TO_VICT);
			REMOVE_BIT(victim->special,SPC_SIRE);
			return;
		}
		act("You grant $N permission to sire a childe!",ch,NULL,victim,TO_CHAR);
		act("$n has granted $N permission to sire a childe!",ch,NULL,victim,TO_NOTVICT);
		act("$n has granted you permission to sire a childe!",ch,NULL,victim,TO_VICT);
		SET_BIT(victim->special,SPC_SIRE);
		return;
	}
	else if ( !str_cmp(arg2,"primogen") && (ch->pcdata->stats[UNI_GEN] == 2 || IS_SET(ch->special,SPC_PRINCE) || !str_cmp(ch->name->str,"Dominion")) )
	{
		if (IS_SET(victim->special,SPC_PRIMOGEN)) {
			act("You remove $N's primogen status!",ch,NULL,victim,TO_CHAR);
			act("$n has removed $N's primogen status!",ch,NULL,victim,TO_NOTVICT);
			act("$n has remove your primogen status!",ch,NULL,victim,TO_VICT);
		REMOVE_BIT(victim->special,SPC_PRIMOGEN);return;}
		act("You grant $N primogen status!",ch,NULL,victim,TO_CHAR);
		act("$n has granted $N primogen status!",ch,NULL,victim,TO_NOTVICT);
		act("$n has granted you primogen status!",ch,NULL,victim,TO_VICT);
		SET_BIT(victim->special,SPC_PRIMOGEN);
		return;
	}
	else if ( !str_cmp(arg2,"justicar") && (ch->pcdata->stats[UNI_GEN] == 2 || IS_SET(ch->special,SPC_PRINCE) || !str_cmp(ch->name->str,"Dominion")) )
	{
		if (IS_SET(victim->special,SPC_JUSTICAR)) {
			act("You remove $N's justicar status!",ch,NULL,victim,TO_CHAR);
			act("$n has removed $N's justicar status!",ch,NULL,victim,TO_NOTVICT);
			act("$n has remove your justicar status!",ch,NULL,victim,TO_VICT);
		REMOVE_BIT(victim->special,SPC_JUSTICAR);return;}
		act("You grant $N justicar status!",ch,NULL,victim,TO_CHAR);
		act("$n has granted $N justicar status!",ch,NULL,victim,TO_NOTVICT);
		act("$n has granted you justicar status!",ch,NULL,victim,TO_VICT);
		SET_BIT(victim->special,SPC_JUSTICAR);
		return;
	}
/*
    else if ( !str_cmp(arg2,"outcast") && victim->pcdata->stats[UNI_GEN] > 2 && 
	ch->pcdata->stats[UNI_GEN] == 2)
    {
	act("You make $N a Caitiff!",ch,NULL,victim,TO_CHAR);
	act("$n has made $N a Caitiff!",ch,NULL,victim,TO_NOTVICT);
	act("$n has made you a Caitiff!",ch,NULL,victim,TO_VICT);
	free_string(victim->clan);
	victim->clan = str_dup( "" );
	return;
    }
    else if ( !str_cmp(arg2,"outcast") && victim->pcdata->stats[UNI_GEN] > 2 && 
	!IS_SET(victim->special, SPC_PRINCE) && IS_SET(ch->special,SPC_PRINCE))
    {
	act("You make $N a Caitiff!",ch,NULL,victim,TO_CHAR);
	act("$n has made $N a Caitiff!",ch,NULL,victim,TO_NOTVICT);
	act("$n has made you a Caitiff!",ch,NULL,victim,TO_VICT);
	free_string(victim->clan);
	victim->clan = str_dup( "" );
	return;
    }
    else if ( !str_cmp(arg2,"induct") && victim->pcdata->stats[UNI_GEN] > 2 && 
	ch->pcdata->stats[UNI_GEN] == 2 && strlen(victim->clan) < 2)
    {
	if (IS_SET(victim->special, SPC_ANARCH))
	{
	    send_to_char("You cannot induct an Anarch!\n\r",ch);
	    return;
	}
	act("You induct $N into your clan!",ch,NULL,victim,TO_CHAR);
	act("$n inducts $N into $s clan!",ch,NULL,victim,TO_NOTVICT);
	act("$n inducts you into $s clan!",ch,NULL,victim,TO_VICT);
	free_string(victim->clan);
	victim->clan = str_dup( ch->clan );
	return;
    }
    else if ( !str_cmp(arg2,"induct") && victim->pcdata->stats[UNI_GEN] > 2 && 
	!IS_SET(victim->special, SPC_PRINCE) && IS_SET(ch->special,SPC_PRINCE) &&
	strlen(victim->clan) < 2)
    {
	if (IS_SET(victim->special, SPC_ANARCH))
	{
	    send_to_char("You cannot induct an Anarch!\n\r",ch);
	    return;
	}
	act("You induct $N into your clan!",ch,NULL,victim,TO_CHAR);
	act("$n inducts $N into $s clan!",ch,NULL,victim,TO_NOTVICT);
	act("$n inducts you into $s clan!",ch,NULL,victim,TO_VICT);
	free_string(victim->clan);
	victim->clan = str_dup( ch->clan );
	return;
    }
    else if ( !str_cmp(arg2,"accept") &&
	(ch->pcdata->stats[UNI_GEN] == 2 || IS_SET(ch->special,SPC_PRINCE)))
    {
	if ( victim->pcdata->rank > AGE_CHILDE)
	{ send_to_char("But they are not a childe!\n\r",ch); return; }
	act("You accept $N into the clan!",ch,NULL,victim,TO_CHAR);
	act("$n has accepted $N into $s clan!",ch,NULL,victim,TO_NOTVICT);
	act("$n accepted you into $s clan!",ch,NULL,victim,TO_VICT);
	victim->pcdata->rank = AGE_NEONATE;
	return;
    }
*/
	else send_to_char( "You are unable to grant that sort of favour.\n\r", ch );
	return;
}


void do_totems( CHAR_DATA *ch, char *argument )
{
	char arg1[MAX_INPUT_LENGTH];
	char arg2[MAX_INPUT_LENGTH];
	char buf[MAX_STRING_LENGTH];
	
	bool ADVANCED_TOT = FALSE;
	
	argument = one_argument( argument, arg1 );
	argument = one_argument( argument, arg2 );
	
	if (IS_NPC(ch)) return;
	
	if (!IS_CLASS(ch, CLASS_WEREWOLF))
	{
		send_to_char("Huh?\n\r",ch);
		return;
	}
	
	if (arg1[0] == '\0' && arg2[0] == '\0')
	{
		sprintf(buf,"Totems:\n\r{GBear	{g({G%d{g)	{GLynx	{g({G%d{g)	{GBoar		{g({G%d{g)\n\r{GOwl	{g({G%d{g)	{GSpider	{g({G%d{g)	{GWolf		{g({G%d{g),\n\r{GHawk	{g({G%d{g)	{GMantis	{g({G%d{g)	{GShark		{g({G%d{g)\n\r{GSphinx	{g({G%d{g)	{GRat	{g({G%d{g)	{GChameleon	{g({G%d{g).{x\n\r",
			ch->pcdata->powers[WPOWER_BEAR], ch->pcdata->powers[WPOWER_LYNX],
			ch->pcdata->powers[WPOWER_BOAR], ch->pcdata->powers[WPOWER_OWL],
			ch->pcdata->powers[WPOWER_SPIDER], ch->pcdata->powers[WPOWER_WOLF],
			ch->pcdata->powers[WPOWER_HAWK],ch->pcdata->powers[WPOWER_MANTIS],
			ch->pcdata->powers[WPOWER_SHARK],ch->pcdata->powers[WPOWER_SPHINX],
			ch->pcdata->powers[WPOWER_RAT],ch->pcdata->powers[WPOWER_CHAMELEON]);
		send_to_char(buf,ch);
		return;
	}
	if (arg2[0] == '\0')
	{
		if (!str_cmp(arg1,"bear"))
		{
			send_to_char("Bear: The totem of strength and aggression.\n\r",ch);
			if (ch->pcdata->powers[WPOWER_BEAR] < 1) 
				send_to_char("You have none of the Bear totem powers.\n\r",ch);
			if (ch->pcdata->powers[WPOWER_BEAR] > 0) 
				send_to_char("FLEX: You strength is so great that no ropes can hold you.\n\r",ch);
			if (ch->pcdata->powers[WPOWER_BEAR] > 1) 
				send_to_char("RAGE: You are able to build yourself up a rage at will.\n\r",ch);
			if (ch->pcdata->powers[WPOWER_BEAR] > 2) 
				send_to_char("Steel claws: Your claws are so tough that they can parry weapons.\n\r",ch);
			if (ch->pcdata->powers[WPOWER_BEAR] > 3) 
				send_to_char("Hibernation: Your wounds heal at amazing speeds when you sleep.\n\r",ch);
			if (ch->pcdata->powers[WPOWER_BEAR] > 4) 
				send_to_char("Enhanced Damage: You inflict more damage in combat.\n\r",ch);
			return;
		}
		else if (!str_cmp(arg1,"boar"))
		{
			send_to_char("Boar: The totem of toughness and perserverance.\n\r",ch);
			if (ch->pcdata->powers[WPOWER_BOAR] < 1) 
				send_to_char("You have none of the Boar totem powers.\n\r",ch);
			if (ch->pcdata->powers[WPOWER_BOAR] > 0) 
				send_to_char("Shatter: No door is sturdy enough to resist you.\n\r",ch);
			if (ch->pcdata->powers[WPOWER_BOAR] > 1) 
				send_to_char("CHARGE: Your first blow in combat has a +100 damage bonus.\n\r",ch);
			if (ch->pcdata->powers[WPOWER_BOAR] > 2) 
				send_to_char("Toughness: Your skin is extremely tough. You take half damage in combat.\n\r",ch);
			if (ch->pcdata->powers[WPOWER_BOAR] > 3) 
				send_to_char("Immovability: You are able to shrug off blows that would knock out most people.\n\r",ch);
			if (ch->pcdata->powers[WPOWER_BOAR] > 4) 
				send_to_char("Supreme Toughness: Your skin is strong beyond belief. You take one quarter damage in combat.\n\r",ch);
			
			return;
		}
		else if (!str_cmp(arg1,"shark"))
		{
			send_to_char("Shark: The totem of toughness and speed.\n\r",ch);
			if (ch->pcdata->powers[WPOWER_SHARK] < 1) 
				send_to_char("You have none of the Shark totem powers.\n\r",ch);
			if (ch->pcdata->powers[WPOWER_SHARK] > 0) 
				send_to_char("Vicious Jaws: Bite attack more often.\n\r",ch);
			if (ch->pcdata->powers[WPOWER_SHARK] > 1) 
				send_to_char("Gnawing Bite: More damage from bite attack.\n\r",ch);
			if (ch->pcdata->powers[WPOWER_SHARK] > 2) 
				send_to_char("Clenching Jaws: Chance to snap jaws on to a fleeing opponent.\n\r",ch);
			if (ch->pcdata->powers[WPOWER_SHARK] > 3) 
				send_to_char("Bite of Fenris: Chance of biting off limbs in combat.\n\r",ch);
			if (ch->pcdata->powers[WPOWER_SHARK] > 4) 
				send_to_char("Slashing Wound: Increased blood loos or damage from bite attacks.\n\r",ch);
			
			return;
		}
		else if (!str_cmp(arg1,"sphinx"))
		{
			send_to_char("Sphinx: The totem of toughness and speed.\n\r",ch);
			if (ch->pcdata->powers[WPOWER_SPHINX] < 1) 
				send_to_char("You have none of the Sphinx totem powers.\n\r",ch);
			if (ch->pcdata->powers[WPOWER_SPHINX] > 0) 
				send_to_char("Moon Gate:\n\r",ch);
			if (ch->pcdata->powers[WPOWER_SPHINX] > 1) 
				send_to_char("Griffin's Tail:\n\r",ch);
			if (ch->pcdata->powers[WPOWER_SPHINX] > 2) 
				send_to_char("Moon Beam:\n\r",ch);
			if (ch->pcdata->powers[WPOWER_SPHINX] > 3) 
				send_to_char("\n\r",ch);
			if (ch->pcdata->powers[WPOWER_SPHINX] > 4) 
				send_to_char("Luna's Armor:\n\r",ch);
			
			return;
		}
		else if (!str_cmp(arg1,"rat"))
		{
			send_to_char("Rat: \n\r",ch);
			if (ch->pcdata->powers[WPOWER_RAT] < 1) 
				send_to_char("You have none of the Rat totem powers.\n\r",ch);
			if (ch->pcdata->powers[WPOWER_RAT] > 0) 
				send_to_char("Burrow:                              \n\r",ch);
			if (ch->pcdata->powers[WPOWER_RAT] > 1) 
				send_to_char("Quills:                                    \n\r",ch);
			if (ch->pcdata->powers[WPOWER_RAT] > 2) 
				send_to_char("Speed of the Rat:                           \n\r",ch);
			if (ch->pcdata->powers[WPOWER_RAT] > 3) 
				send_to_char("Pounce:                \n\r",ch);
			if (ch->pcdata->powers[WPOWER_RAT] > 4) 
				send_to_char("Prowl:                         \n\r",ch);
			
			return;
		}
		else if (!str_cmp(arg1,"chameleon"))
		{
			send_to_char("Chameleon:                              \n\r",ch);
			if (ch->pcdata->powers[WPOWER_CHAMELEON] < 1) 
				send_to_char("You have none of the Chameleon totem powers.\n\r",ch);
			if (ch->pcdata->powers[WPOWER_CHAMELEON] > 0) 
				send_to_char("Mirror Image:\n\r",ch);
			if (ch->pcdata->powers[WPOWER_CHAMELEON] > 1) 
				send_to_char("Stab in the Dark:\n\r",ch);
			if (ch->pcdata->powers[WPOWER_CHAMELEON] > 2) 
				send_to_char("Gift of the Spriggan:\n\r",ch);
			if (ch->pcdata->powers[WPOWER_CHAMELEON] > 3) 
				send_to_char("Instinct:\n\r",ch);
			if (ch->pcdata->powers[WPOWER_CHAMELEON] > 4) 
				send_to_char("Speed of Thought:\n\r",ch);
			
			return;
		}
		else if (!str_cmp(arg1,"lynx"))
		{
			send_to_char("Lynx: The totem of speed and agility.\n\r",ch);
			if (ch->pcdata->powers[WPOWER_LYNX] < 1) 
				send_to_char("You have none of the Lynx totem powers.\n\r",ch);
			if (ch->pcdata->powers[WPOWER_LYNX] > 0) 
				send_to_char("Light footed: You move so lightly that you leave no tracks behind you.\n\r",ch);
			if (ch->pcdata->powers[WPOWER_LYNX] > 1) 
				send_to_char("Stalker: You are able hunt people with much greater speed than normal.\n\r",ch);
			if (ch->pcdata->powers[WPOWER_LYNX] > 2) 
				send_to_char("Combat speed: You have an extra attack in combat.\n\r",ch);
			if (ch->pcdata->powers[WPOWER_LYNX] > 3) 
				send_to_char("Lightning Claws: Yours claws parry blows with lightning fast speed.\n\r",ch);
			if (ch->pcdata->powers[WPOWER_LYNX] > 4) 
				send_to_char("Enhanced Combat speed: You have extra attacks in combat.\n\r",ch);
			return;
		}
		else if (!str_cmp(arg1,"Owl"))
		{
			send_to_char("Owl: The totem of thought and spiritualism.\n\r",ch);
			if (ch->pcdata->powers[WPOWER_OWL] < 1) 
				send_to_char("You have none of the Owl totem powers.\n\r",ch);
			if (ch->pcdata->powers[WPOWER_OWL] > 0) 
				send_to_char("VANISH: You are able to conceal yourself from all but the most perceptive.\n\r",ch);
			if (ch->pcdata->powers[WPOWER_OWL] > 1) 
				send_to_char("SHIELD: You are able to shield your mind from scrying and aura-reading.\n\r",ch);
			if (ch->pcdata->powers[WPOWER_OWL] > 2) 
				send_to_char("SHADOWPLANE: You are able to enter the shadow plane.\n\r",ch);
			if (ch->pcdata->powers[WPOWER_OWL] > 3) 
				send_to_char("Magical Control: You are able to fully control your magic in crinos form.\n\r",ch);
			return;
		}
		else if (!str_cmp(arg1,"Spider"))
		{
			send_to_char("Spider: The totem of ambush and cunning.\n\r",ch);
			if (ch->pcdata->powers[WPOWER_SPIDER] < 1) 
				send_to_char("You have none of the Spider totem powers.\n\r",ch);
			if (ch->pcdata->powers[WPOWER_SPIDER] > 0) 
				send_to_char("Poisonous bite: Your bite injects your opponents with a deadly venom.\n\r",ch);
			if (ch->pcdata->powers[WPOWER_SPIDER] > 1) 
				send_to_char("WEB: You are able to shoot a web at your opponents to entrap them.\n\r",ch);
			if (ch->pcdata->powers[WPOWER_SPIDER] > 2) 
				send_to_char("Immunity to poison: Poisons have no affect upon you.\n\r",ch);
			return;
		}
		else if (!str_cmp(arg1,"Wolf"))
		{
			send_to_char("Wolf: Controlling your innate wolf powers.\n\r",ch);
			if (ch->pcdata->powers[WPOWER_WOLF] < 1) 
				send_to_char("You have none of the Wolf totem powers.\n\r",ch);
			if (ch->pcdata->powers[WPOWER_WOLF] > 0) 
				send_to_char("CLAWS: You can extend or retract your claws at will.\n\r",ch);
			if (ch->pcdata->powers[WPOWER_WOLF] > 1) 
				send_to_char("FANGS: You can extend or retract your fangs at will.\n\r",ch);
			if (ch->pcdata->powers[WPOWER_WOLF] > 2) 
				send_to_char("CALM: You are able to repress your inner beast at will.\n\r",ch);
			if (ch->pcdata->powers[WPOWER_WOLF] > 3) 
				send_to_char("Spirit of Fenris: You are able to enter rage faster than normal.\n\r",ch);
			return;
		}
		else if (!str_cmp(arg1,"Hawk"))
		{
			send_to_char("Hawk: The totem of vision and perception.\n\r",ch);
			if (ch->pcdata->powers[WPOWER_HAWK] < 1) 
				send_to_char("You have none of the Wolf totem powers.\n\r",ch);
			if (ch->pcdata->powers[WPOWER_HAWK] > 0) 
				send_to_char("NIGHTSIGHT: You can see perfectly well in the dark.\n\r",ch);
			if (ch->pcdata->powers[WPOWER_HAWK] > 1) 
				send_to_char("SHADOWSIGHT: You can see into the plane of shadows.\n\r",ch);
			if (ch->pcdata->powers[WPOWER_HAWK] > 2) 
				send_to_char("TRUESIGHT: You have perfect vision.\n\r",ch);
			return;
		}
		else if (!str_cmp(arg1,"Mantis"))
		{
			send_to_char("Mantis: The totem of dexterity and reflexes.\n\r",ch);
			if (ch->pcdata->powers[WPOWER_MANTIS] < 1) 
				send_to_char("You have none of the Mantis totem powers.\n\r",ch);
			if (ch->pcdata->powers[WPOWER_MANTIS] > 3) 
				send_to_char("Incredibly fast attacks: Your opponents get -20 to parry and -40 to dodge.\n\r",ch);
			else if (ch->pcdata->powers[WPOWER_MANTIS] > 2) 
				send_to_char("Extremely fast attacks: Your opponents get -15 to parry and -30 to dodge.\n\r",ch);
			else if (ch->pcdata->powers[WPOWER_MANTIS] > 1) 
				send_to_char("Very fast attacks: Your opponents get -10 to parry and -20 to dodge.\n\r",ch);
			else if (ch->pcdata->powers[WPOWER_MANTIS] > 0) 
				send_to_char("Fast attacks: Your opponents get -5 to parry and -10 to dodge.\n\r",ch);
			return;
		}
		sprintf(buf,"Totems: Bear (%d), Lynx (%d), Boar (%d), Owl (%d), Spider (%d), Wolf (%d),\n\r        Hawk (%d), Mantis (%d).\n\r",
			ch->pcdata->powers[WPOWER_BEAR], ch->pcdata->powers[WPOWER_LYNX],
			ch->pcdata->powers[WPOWER_BOAR], ch->pcdata->powers[WPOWER_OWL],
			ch->pcdata->powers[WPOWER_SPIDER], ch->pcdata->powers[WPOWER_WOLF],
			ch->pcdata->powers[WPOWER_HAWK],ch->pcdata->powers[WPOWER_MANTIS]);
		send_to_char(buf,ch);
		return;
	}
	if (!str_cmp(arg2,"improve"))
	{
		int improve;
		int cost;
		int max;
		
		if (!str_cmp(arg1,"bear"   )) {improve = WPOWER_BEAR;   max=5;}
		else if (!str_cmp(arg1,"boar"   )) {improve = WPOWER_BOAR;   max=5;}
		else if (!str_cmp(arg1,"lynx"   )) {improve = WPOWER_LYNX;   max=5;}
		else if (!str_cmp(arg1,"owl"    )) {improve = WPOWER_OWL;    max=4;}
		else if (!str_cmp(arg1,"spider" )) {improve = WPOWER_SPIDER; max=3;}
		else if (!str_cmp(arg1,"wolf"   )) {improve = WPOWER_WOLF;   max=4;}
		else if (!str_cmp(arg1,"hawk"   )) {improve = WPOWER_HAWK;   max=3;}
		else if (!str_cmp(arg1,"mantis" )) {improve = WPOWER_MANTIS; max=4;}
		else if (!str_cmp(arg1,"shark" )) 
		{
			if (ch->pcdata->powers[WPOWER_MANTIS] < 4 || ch->pcdata->powers[WPOWER_BEAR] < 5)
			{
				send_to_char("You must have Mantis 4 and Bear 5 before you get the Shark Totem.\n\r",ch);
				return;	
			}
			ADVANCED_TOT = TRUE;
			improve = WPOWER_SHARK; max=5;
			
		}
		else if (!str_cmp(arg1,"sphinx" ))
		{
			if (ch->pcdata->powers[WPOWER_OWL] < 4 || ch->pcdata->powers[WPOWER_HAWK] < 3)
			{
				send_to_char("You must have Owl 4 and Hawk 3 before you get the Sphinx Totem.\n\r",ch);
				return;
			}
			ADVANCED_TOT = TRUE;
			improve = WPOWER_SPHINX; max=5;
			
		}
		else if (!str_cmp(arg1,"rat" ))
		{
			if (ch->pcdata->powers[WPOWER_SPIDER] < 3 || ch->pcdata->powers[WPOWER_BOAR] < 5)
			{
				send_to_char("You must have Spider 3 and Boar 5 before you get the Rat Totem.\n\r",ch);
				return;
			}
			ADVANCED_TOT = TRUE;
			improve = WPOWER_RAT; max=5;
			
		}
		else if (!str_cmp(arg1,"chameleon" ))
		{
			if (ch->pcdata->powers[WPOWER_LYNX] < 5 || ch->pcdata->powers[WPOWER_WOLF] < 4)
			{
				send_to_char("You must have Lynx 5 and Wolf 4 before you get the Chameleon Totem.\n\r",ch);
				return;
			}
			ADVANCED_TOT = TRUE;
			improve = WPOWER_CHAMELEON; max=5;
			
		}
		else
		{
			send_to_char("You can improve: Bear, Boar, Lynx, Owl, Spider, Wolf, Hawk, Mantis, Shark, Sphinx, Rat or Chameleon.\n\r",ch);
			return;
		}
		if ( ADVANCED_TOT == FALSE )
			cost = (ch->pcdata->powers[improve]+1) * COST_TOTEM;
		else
			cost = ((ch->pcdata->powers[improve]+1) * COST_TOTEM) + 50;
		
		arg1[0] = UPPER(arg1[0]);
		if ( ch->pcdata->powers[improve] >= max )
		{
			sprintf(buf,"You have already gained all the powers of the %s totem.\n\r", arg1);
			send_to_char(buf,ch);
			return;
		}
		if ( cost > ch->practice )
		{
			sprintf(buf,"It costs you %d primal to improve your %s totem.\n\r", cost, arg1);
			send_to_char(buf,ch);
			return;
		}
		ch->pcdata->powers[improve] += 1;
		ch->practice -= cost;
		ch->pcdata->spent[SPENT_P] += cost;
		sprintf(buf,"You improve your ability in the %s totem.\n\r", arg1);
		send_to_char(buf,ch);
	}
	else send_to_char("To improve a totem, type: Totem <totem type> improve.\n\r",ch);
	return;
}


void do_birth( CHAR_DATA *ch, char *argument )
{
	char buf2[MAX_STRING_LENGTH];
	
	if (IS_NPC(ch)) return;
	
	if (!IS_EXTRA(ch, EXTRA_PREGNANT))
	{
		send_to_char("But you are not even pregnant!\n\r",ch);
		return;
	}
	
	if (!IS_EXTRA(ch, EXTRA_LABOUR))
	{
		send_to_char("You're not ready to give birth yet.\n\r",ch);
		return;
	}
	
	if ( argument[0] == '\0' )
	{
		if (ch->pcdata->genes[4] == SEX_MALE)
			send_to_char( "What do you wish to name your little boy?\n\r", ch );
		else if (ch->pcdata->genes[4] == SEX_FEMALE)
			send_to_char( "What do you wish to name your little girl?\n\r", ch );
		else
			send_to_char( "What do you wish to name your child?\n\r", ch );
		return;
	}
	
	if (!check_parse_name( argument ))
	{
		send_to_char( "Thats an illegal name.\n\r", ch );
		return;
	}
	
	if ( char_exists(FALSE,argument) )
	{
		send_to_char( "That player already exists.\n\r", ch );
		return;
	}
	
	str_cpy(buf2,ch->pcdata->cparents->str);
	strcat(buf2," ");
	strcat(buf2,argument);
	if (!birth_ok(ch, buf2))
	{
		send_to_char( "Bug - please inform Spiral\n\r", ch );
		return;
	}
	argument[0] = UPPER(argument[0]);
	birth_write( ch, argument );
	ch->pcdata->genes[9] += 1;
	REMOVE_BIT(ch->extra, EXTRA_PREGNANT);
	REMOVE_BIT(ch->extra, EXTRA_LABOUR);
	save_char_obj(ch);
	return;
}

bool birth_ok( CHAR_DATA *ch, char *argument )
{
	char buf [MAX_STRING_LENGTH];
	char mum [MAX_INPUT_LENGTH];
	char dad [MAX_INPUT_LENGTH];
	char child [MAX_INPUT_LENGTH];
	
	argument = one_argument( argument, mum );
	argument = one_argument( argument, dad );
	argument = one_argument( argument, child );
	
	if (dad[0] == '\0')
	{
		send_to_char("You are unable to give birth - please inform Spiral\n\r",ch);
		return FALSE;
	}
	if (child[0] == '\0')
	{
		send_to_char("You are unable to give birth - please inform Spiral\n\r",ch);
		return FALSE;
	}
	dad[0] = UPPER(dad[0]);
	child[0] = UPPER(child[0]);
	if (ch->pcdata->genes[4] == SEX_MALE)
	{
		send_to_char("You give birth to a little boy!\n\r",ch);
		sprintf(buf,"%s has given birth to %s's son, named %s!",ch->name->str,dad,child);
		do_info(ch,buf);
		return TRUE; 
	}
	else if (ch->pcdata->genes[4] == SEX_FEMALE)
	{
		send_to_char("You give birth to a little girl!\n\r",ch);
		sprintf(buf,"%s has given birth to %s's daughter, named %s!",ch->name->str,dad,child);
		do_info(ch,buf);
		return TRUE; 
	}
	return FALSE;
}


bool char_exists( bool backup, char *argument )
{
	FILE *fp;
	char buf [MAX_STRING_LENGTH];
	bool found = FALSE;
	
	fclose( fpReserve );
	if (backup)
		sprintf( buf, "%sbackup/%s", PLAYER_DIR, capitalize( argument ) );
	else
		sprintf( buf, "%s%s", PLAYER_DIR, capitalize( argument ) );
	if ( ( fp = fopen( buf, "r" ) ) != NULL )
	{
		found = TRUE;
		fclose( fp );
	}
	fpReserve = fopen( NULL_FILE, "r" );
	return found;
}

void birth_write( CHAR_DATA *ch, char *argument )
{
	FILE *fp;
	char buf [MAX_STRING_LENGTH];
	char *strtime;
	
	strtime = ctime( &current_time );
	strtime[strlen(strtime)-1] = '\0';
	
	sprintf( buf, "%s%s", PLAYER_DIR, capitalize( argument ) );
	if ( ( fp = fopen(buf, "w") ) != NULL) 
	{  
		fprintf( fp, "#PLAYERS\n");
		fprintf( fp, "Name         %s~\n",capitalize( argument ));
		fprintf( fp, "ShortDescr   ~\n"				);
		fprintf( fp, "LongDescr    ~\n"				);
		fprintf( fp, "Description  ~\n"				);
		fprintf( fp, "Lord         ~\n"				);
		fprintf( fp, "iCla         0\n"				);
		fprintf( fp, "Class        0\n"				);
		fprintf( fp, "Morph        ~\n"				);
		fprintf( fp, "Createtime   %s~\n", strtime	);
		fprintf( fp, "Lasttime     ~\n"				);
		fprintf( fp, "Lasthost     ~\n"				);
		fprintf( fp, "Poweraction  ~\n"				);
		fprintf( fp, "Powertype    ~\n"				);
		fprintf( fp, "Prompt       ~\n"				);
		fprintf( fp, "Cprompt      ~\n"				);
		fprintf( fp, "Sex          %d\n",ch->pcdata->genes[4]	);
		fprintf( fp, "Race         0\n"				);
		fprintf( fp, "Immune       %d\n",ch->pcdata->genes[3]	);
		fprintf( fp, "Polyaff      0\n"				);
		fprintf( fp, "ChrPnts      20\n"			);
		fprintf( fp, "Itemaffect   0\n"				);
		fprintf( fp, "Vampaff      0\n"				);
		fprintf( fp, "Vamppass     0\n"				);
		fprintf( fp, "Form         32767\n"			);
		fprintf( fp, "Beast        15\n"			);
		fprintf( fp, "Vampgen      -1\n"			);
		fprintf( fp, "Spectype     0\n"				);
		fprintf( fp, "Specpower    0\n"				);
		fprintf( fp, "Home         3001\n"			);
		fprintf( fp, "Level        2\n"				);
		fprintf( fp, "Trust        0\n"				);
		fprintf( fp, "Played       0\n"				);
		fprintf( fp, "Room         %d\n",ch->in_room->vnum 	);
		fprintf( fp, "PkPdMkMd     0 0 0 0\n"			);
		fprintf( fp, "Weapons      0 0 0 0 0 0 0 0 0 0 0 0 0\n"	);
		fprintf( fp, "Spells       4 4 4 4 4\n"			);
		fprintf( fp, "Combat       0 0 0 0 0 0 0 0\n"		);
		fprintf( fp, "Stance       0 0 0 0 0 0 0 0 0 0 0\n"	);
		fprintf( fp, "Locationhp   0 0 0 0 0 0 0\n"		);
		fprintf( fp, "HpManaMove   %d %d %d %d %d %d\n",
			ch->pcdata->genes[0], ch->pcdata->genes[0], ch->pcdata->genes[1], 
			ch->pcdata->genes[1], ch->pcdata->genes[2], ch->pcdata->genes[2]);
		fprintf( fp, "Gold         0\n"				);
		fprintf( fp, "Exp          0\n"				);
		fprintf( fp, "Act          1600\n"   			);
		fprintf( fp, "Extra        32768\n"   			);
		fprintf( fp, "AffectedBy   0\n"				);
		fprintf( fp, "Position     7\n"				);
		fprintf( fp, "Practice     0\n"				);
		fprintf( fp, "SavingThrow  0\n"				);
		fprintf( fp, "Alignment    0\n"				);
		fprintf( fp, "Hitroll      0\n"				);
		fprintf( fp, "Damroll      0\n"				);
		fprintf( fp, "Armor        100\n"			);
		fprintf( fp, "Wimpy        0\n"				);
		fprintf( fp, "Deaf         0\n"				);
		fprintf( fp, "Password     %s~\n",ch->pcdata->pwd->str	);
		fprintf( fp, "Bamfin       ~\n"				);
		fprintf( fp, "Bamfout      ~\n"				);
		fprintf( fp, "Title         the mortal~\n"		);
		fprintf( fp, "Conception   ~\n"				);
		fprintf( fp, "Parents      %s~\n",ch->pcdata->cparents->str	);
		fprintf( fp, "Cparents     ~\n"				);
		fprintf( fp, "AttrPerm     %d %d %d %d %d\n",
			ch->pcdata->perm_str,
			ch->pcdata->perm_int,
			ch->pcdata->perm_wis,
			ch->pcdata->perm_dex,
			ch->pcdata->perm_con );
		fprintf( fp, "AttrMod      0 0 0 0 0\n"			);
		fprintf( fp, "Quest        0\n"				);
		fprintf( fp, "Wolf         0\n"				);
		fprintf( fp, "Rank         0\n"				);
		fprintf( fp, "Stage        0 0 0\n"			);
		fprintf( fp, "Wolfform     0 0\n"			);
		fprintf( fp, "Runes        0 0 0 0\n"			);
		fprintf( fp, "Disc         0 0 0 0 0 0 0 0 0 0 0\n"	);
		fprintf( fp, "Genes        0 0 0 0 0 0 0 0 0 0\n"	);
		fprintf( fp, "FakeCon      0 0 0 0 0 0 0 0\n"		);
		fprintf( fp, "Condition    0 48 48\n"			);
		fprintf( fp, "End\n\n" );
		fprintf( fp, "#END\n" );
		fclose( fp );
	}
	return;
}



void do_induct ( CHAR_DATA * ch, char *argument )
{
	CHAR_DATA *victim;
	char      arg [MAX_INPUT_LENGTH];
	char      arg2 [MAX_INPUT_LENGTH];
	
	argument = one_argument( argument, arg );
	argument = one_argument( argument, arg2 );
	
	if (IS_NPC(ch))
		return;
	
	if (!IS_HERO(ch))
		return;

	if ( arg[0] == '\0' )
	{
		if (!IS_IMMUNE(ch, IMM_INDUCT))
		{
			SET_BIT(ch->immune, IMM_INDUCT);
			send_to_char("You will now allow your prince to induct you.\n\r",ch);
			return;
		}
		send_to_char("You will no longer allow your prince to induct you.\n\r",ch);
		REMOVE_BIT(ch->immune, IMM_INDUCT);
		return;
   }
	
	if ( ( victim = get_char_room( ch, arg ) ) == NULL )
	{
		send_to_char( "They aren't here.\n\r", ch );
		return;
	}
	
	if ( IS_NPC(victim) )
	{
		send_to_char( "Not on NPC's.\n\r", ch );
		return;
	}

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


	if ( IS_IMMORTAL(victim) )
	{
		send_to_char( "Not on Immortals's.\n\r", ch );
		return;
	}
	
	if ( ch == victim )
	{
		send_to_char( "You cannot induct yourself.\n\r", ch );
		return;
	}
	
	if ( !IS_SET(ch->special, SPC_PRINCE))
	{
		send_to_char( "Only the prince may induct members.\n\r", ch);
		return;
	}
	
	if ( !IS_IMMUNE(victim,IMM_INDUCT) )
	{
		send_to_char("That player does not want to be inducted.\n\r", ch);
		return;
	}
	
	if (victim->sect != SECT_INDEPENDENT)
	{
		if ( arg2[0] == '\0' )
		{
			send_to_char("That player is already inducted.\n\r", ch);
			return;
		}
		victim->sect = SECT_INDEPENDENT;
		act("$N just got kicked out of thier sect.", ch, NULL, victim, TO_CHAR);
		act("$n has kicked you out of your sect.", ch, NULL, victim, TO_VICT);
		return;
	}
		
	act("$N is now inducted.", ch, NULL, victim, TO_CHAR);
	act("$n has inducted you in your sect.", ch, NULL, victim, TO_VICT);
	victim->sect = ch->sect;
	ch->exp -= 1000000;
	
	return;
	
}

void do_antitribu( CHAR_DATA *ch, char *argument )
{
	if ( IS_NPC(ch) )
		return;
	
	if ( !IS_CLASS(ch, CLASS_VAMPIRE) )
	{
		send_to_char("Huh?\n\r", ch);
		return;
	}
	
	if ( IS_SET(ch->special, SPC_INDUCTED) )
	{
		send_to_char("You cannot antitribu if you are already inducted into a sect.\n\r", ch);
		return;
	}
	
	if ( IS_SET(ch->special, SPC_ANTITRIBU) )
	{
		REMOVE_BIT(ch->special, SPC_ANTITRIBU);
		send_to_char("You are no longer antitribu.\n\r", ch);
	}
	else
	{
		SET_BIT(ch->special, SPC_ANTITRIBU);  
		send_to_char( "You are now antitribu.\n\r", ch);
	}
	
	return;
}

/*
int get_disc( CHAR_DATA * ch, int discipline_no )
{
	sh_int count;
	
	if (IS_NPC(ch))
		return 0;
	
	for ( count = 0 ; count <= 10 ; count++ )
	{
		if ( ch->pcdata->discipline[discipline_no] > count )
			continue;
		else
			break;
	}
	
	return count;
}
*/


int discipline_lookup (const char *name)
{
	int discipline;
	
	for ( discipline = 0; discipline < MAX_DISC;discipline++)
	{
		if (LOWER(name[0]) == LOWER(discipline_table[discipline].name[0])
			&&  !str_prefix( name,discipline_table[discipline].name))
			return discipline;
	}
	
	return -1;
}

int vamp_clan_lookup (const char *name)
{
	int vamp_clan;
	
	for ( vamp_clan = 0; vamp_clan < MAX_VAMP_CLAN ;vamp_clan++)
	{
		if (LOWER(name[0]) == LOWER(vamp_clan_table[vamp_clan].name[0])
			&&  !str_prefix( name,vamp_clan_table[vamp_clan].name))
			return vamp_clan;
	}
	
	return -1;
}
void increase_gifts( CHAR_DATA *ch, char *argument )
{
    char arg  [MAX_INPUT_LENGTH];
    char buf  [MAX_INPUT_LENGTH];
    int  improve, imp_cost;
    int  gt = 0;
    int  gift = 0;
    int  ww_max = 5;
    
    one_argument( argument, arg );

	if      (!str_cmp(argument,"homid")) 
	{improve = BREED_HOMID; gt = 0;}
    else if (!str_cmp(argument,"lupus")) 
	{improve = BREED_LUPUS; gt = 0;}
    else if (!str_cmp(argument,"metis")) 
	{improve = BREED_METIS; gt = 0;}
    else if (!str_cmp(argument,"ragabash")) 
	{improve = AUSPICE_RAGABASH; gt = 1;}
    else if (!str_cmp(argument,"theurge")) 
	{improve = AUSPICE_THEURGE; gt = 1;}
    else if (!str_cmp(argument,"philodox")) 
	{improve = AUSPICE_PHILODOX; gt = 1;}
    else if (!str_cmp(argument,"galliard")) 
	{improve = AUSPICE_GALLIARD; gt = 1;}
    else if (!str_cmp(argument,"ahroun")) 
	{improve = AUSPICE_AHROUN; gt = 1;}
    else if (!str_cmp(argument,"black furies")) 
	{improve = TRIBE_BLACK_FURIES; gt = 2;}
    else if (!str_cmp(argument,"bone gnawers")) 
	{improve = TRIBE_BONE_GNAWERS; gt = 2;}
    else if (!str_cmp(argument,"children of gaia")) 
	{improve = TRIBE_CHILDREN_OF_GAIA; gt = 2;}
    else if (!str_cmp(argument,"fianna")) 
	{improve = TRIBE_FIANNA; gt = 2;}
    else if (!str_cmp(argument,"get of fenris")) 
	{improve = TRIBE_GET_OF_FENRIS; gt = 2;}
    else if (!str_cmp(argument,"glass walkers")) 
	{improve = TRIBE_GLASS_WALKERS; gt = 2;}
    else if (!str_cmp(argument,"red talons")) 
	{improve = TRIBE_RED_TALONS; gt = 2;}
    else if (!str_cmp(argument,"shadow lords")) 
	{improve = TRIBE_SHADOW_LORDS; gt = 2;}
    else if (!str_cmp(argument,"silent striders")) 
	{improve = TRIBE_SILENT_STRIDERS; gt = 2;}
    else if (!str_cmp(argument,"silver fangs")) 
	{improve = TRIBE_SILVER_FANGS; gt = 2;}
    else if (!str_cmp(argument,"stargazers")) 
	{improve = TRIBE_STARGAZERS; gt = 2;}
    else if (!str_cmp(argument,"uktena")) 
	{improve = TRIBE_UKTENA; gt = 2;}
    else if (!str_cmp(argument,"child of spiral")) 
	{improve = TRIBE_CHILD_OF_SPIRAL; gt = 2;}
    else if (!str_cmp(argument,"wendigos")) 
	{improve = TRIBE_WENDIGO; gt = 2;}
    else
    {
		send_to_char("You know of no such gift.\n\r",ch);
		return;
    }

    switch (gt)
    {
	default: break;
	case 0: gift = ch->pcdata->breed[improve];
		break;
	case 1: gift = ch->pcdata->auspice[improve];
		break;
	case 2: gift = ch->pcdata->tribes[improve];
		break;
    }

    if (gift == 0)
    {
		send_to_char("You know of no such gift.\n\r",ch);
		return;
    }

    if (gift >= ww_max)
    {
		send_to_char("You are unable to improve your ability in that gift any further.\n\r",ch);
		return;
    }

    if (gift < 1) 
    	gift = 1;
    else 
    	gift++;


	if ((gt == 0 && ch->pcdata->sgift[1] == improve) || (gt == 1 && ch->pcdata->sgift[2] == improve) 
	    || (gt == 2 && ch->pcdata->sgift[3] == improve ))
		imp_cost = gift * 50;
    else
		imp_cost = (gift * 50 ) * 2;

    if (ch->primal_hold < imp_cost && ch->practice < imp_cost)
    {
		sprintf(buf,"You need another %d primal to increase that gift.\n\r", 
	    	imp_cost - ch->practice );
		send_to_char(buf,ch);
		return;
    }

    if ( gift > get_renown(ch) )
	{
		send_to_char("You need to raise your rank in renown before you can buy that.\n\r",ch);
		return;
	} 

    switch (gt)
    {
		default : 
			break;
		case 0: 
			ch->pcdata->breed[improve] = gift;
			break;
		case 1: 
			ch->pcdata->auspice[improve] = gift; 
			break;
		case 2: 
			ch->pcdata->tribes[improve] = gift;
			break;
    }

    if (ch->primal_hold >= imp_cost)
        ch->primal_hold -= imp_cost;
    else  
        ch->practice -= imp_cost;

    send_to_char("You improve your gift.\n\r",ch);

    return;
}

bool check_power(CHAR_DATA *ch, char *argument, int power_type, int power_class, POWER_FUN *power_fun)
{
	CHAR_DATA *victim,*victim_next;
	char arg[MSL];
	//char buf[MSL];

	if (IS_NPC(ch))
	{
		send_to_char("Your a NPC! SHOO!\n\r",ch);
		return FALSE;
	}

	if (!IS_CLASS(ch,power_class))
	{
		send_to_char("Huh?\n\r",ch);
		return FALSE;
	}
	if (power_fun == NULL)
		return FALSE;

	switch (power_type)
	{
		default:
			send_to_char("Power Type not Defined! PLease alert spiral ASAP.\n\r",ch);
			return FALSE;
			break;

		case PTYPE_AFFECT_SELF:
			(*power_fun)(ch,ch,argument);
			send_to_char("\n\r",ch);
			return TRUE;
			break;

		case PTYPE_GENERAL:
			if (HAS_DELAY(ch))
			{
				send_to_char("Not with a wait timer.\n\r",ch);
				return FALSE;
			}

			if (ch->fighting != NULL)
				return FALSE;
			(*power_fun)(ch,ch,argument);
			return TRUE;
			break;

		case PTYPE_VICTIM_ROOM:

			argument = one_argument(argument,arg);

			if (HAS_DELAY(ch))
			{
				send_to_char("Not with a wait timer.\n\r",ch);
				return FALSE;
			}

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

			if ((victim=get_char_room(ch,arg))==NULL)
			{
				send_to_char("There not here. Umm try again.\n\r",ch);
				return FALSE;
			}

			if (IS_ITEMAFF(ch, ITEMA_PEACE)) 
			{
				send_to_char("They wave thier banner of peace.. you surrender..\n\r",ch);
				return FALSE;
			}

			if (HAS_DELAY(victim))
			{
				send_to_char("They have a wait timer... you have to wait!\n\r",ch);
				return FALSE;
			}

			if (!IS_NPC(victim) && !IS_AVATAR(victim))
			{
				send_to_char("Pick on someone your own size.\n\r",ch);
				return FALSE;
			}


			if (!IS_NPC(victim) && IS_IMMORTAL(victim)) 
				return FALSE;

			if (ch == victim)
			{
				send_to_char( "You cannot do this to your self!\n\r", ch );
				return FALSE;
			}

			if (check_disc(ch,victim,CDISC_PK|CDISC_TSAFE|CDISC_PLANE|CDISC_REINA))
				return FALSE;

			
			(*power_fun)(ch,victim,argument);
			return TRUE;
			break;

		case PTYPE_VICTIM_SELF:

			argument = one_argument(argument,arg);

			if (HAS_DELAY(ch))
			{
				send_to_char("Not with a wait timer.\n\r",ch);
				return FALSE;
			}

			if ((victim=get_char_room(ch,arg))==NULL)
			{
				send_to_char("There not here. Umm try again.\n\r",ch);
				return FALSE;
			}

			if (IS_ITEMAFF(ch, ITEMA_PEACE)) 
			{
				send_to_char("They wave thier banner of peace.. you surrender..\n\r",ch);
				return FALSE;
			}

			if (HAS_DELAY(victim))
			{
				send_to_char("They have a wait timer... you have to wait!\n\r",ch);
				return FALSE;
			}

			if (!IS_NPC(victim) && !IS_AVATAR(victim))
			{
				send_to_char("Pick on someone your own size.\n\r",ch);
				return FALSE;
			}


			if (!IS_NPC(victim) && IS_IMMORTAL(victim)) 
				return FALSE;

			if (check_disc(ch,victim,CDISC_PK|CDISC_TSAFE|CDISC_PLANE|CDISC_REINA))
				return FALSE;


			(*power_fun)(ch,victim,argument);
			return TRUE;
			break;

		case PTYPE_OFFENCE_VICTIM_ROOM:

			argument = one_argument(argument,arg);

			if (HAS_DELAY(ch))
			{
				send_to_char("Not with a wait timer.\n\r",ch);
				return FALSE;
			}

			if ((victim=get_char_room(ch,arg))==NULL)
			{
				if (ch->fighting == NULL)
				{
					send_to_char("There not here. Umm try again.\n\r",ch);
					return FALSE;
				}
				else
					victim = ch->fighting; 
			}

			if (IS_ITEMAFF(ch, ITEMA_PEACE)) 
			{
				send_to_char("They wave thier banner of peace.. you surrender..\n\r",ch);
				return FALSE;
			}

			if (HAS_DELAY(victim))
			{
				send_to_char("They have a wait timer... you have to wait!\n\r",ch);
				return FALSE;
			}

			if (!IS_NPC(victim) && !IS_AVATAR(victim))
			{
				send_to_char("Pick on someone your own size.\n\r",ch);
				return FALSE;
			}


			if (!IS_NPC(victim) && IS_IMMORTAL(victim)) 
				return FALSE;

			if (ch == victim)
			{
				send_to_char( "You cannot do this to your self!\n\r", ch );
				return FALSE;
			}

			if (check_disc(ch,victim,CDISC_PK|CDISC_TSAFE|CDISC_PLANE|CDISC_REINA))
				return FALSE;


			(*power_fun)(ch,victim,argument);
			return TRUE;
			break;

		case PTYPE_VICTIM_GLOBAL:

			argument = one_argument(argument,arg);

			if (HAS_DELAY(ch))
			{
				send_to_char("Not with a wait timer.\n\r",ch);
				return FALSE;
			}

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

			if ((victim=get_char_world(ch,arg))==NULL)
			{
				send_to_char("There not here. Umm try again.\n\r",ch);
				return FALSE;
			}

			if (IS_ITEMAFF(ch, ITEMA_PEACE)) 
			{
				send_to_char("They wave thier banner of peace.. you surrender..\n\r",ch);
				return FALSE;
			}

			if (!IS_NPC(victim) && IS_IMMORTAL(victim)) 
				return FALSE;

			if (!IS_NPC(victim) && !IS_AVATAR(victim))
			{
				send_to_char("Pick on someone your own size.\n\r",ch);
				return FALSE;
			}


			if (HAS_DELAY(victim))
			{
				send_to_char("They have a wait timer... you have to wait!\n\r",ch);
				return FALSE;
			}

			if (ch == victim)
			{
				send_to_char( "You cannot do this to your self!\n\r", ch );
				return FALSE;
			}

			if (check_disc(ch,victim,CDISC_PK|CDISC_TSAFE|CDISC_PLANE|CDISC_REINA))
				return FALSE;

			(*power_fun)(ch,victim,argument);
			return TRUE;
			break;

		case PTYPE_OFFENCE_VICTIM_GLOBAL:

			if (HAS_DELAY(ch))
			{
				send_to_char("Not with a wait timer.\n\r",ch);
				return FALSE;
			}

			for(victim = ch->in_room->people; victim != NULL; victim = victim_next)
			{
				victim_next = victim->next_in_room;

				if (IS_ITEMAFF(ch, ITEMA_PEACE)) 
					continue;

				if (!IS_NPC(victim) && IS_IMMORTAL(victim)) 
					continue;

				if (HAS_DELAY(victim))
					continue;

				if (!IS_NPC(victim) && !IS_AVATAR(victim))
					continue;

				if (ch == victim)
					continue;

				if (check_disc(ch,victim,CDISC_PK|CDISC_TSAFE|CDISC_PLANE|CDISC_REINA))
					continue;

				(*power_fun)(ch,victim,argument);
			}
			return TRUE;
			break;

		case PTYPE_OFFENCE_RORP:

			argument = one_argument(argument,arg);
			if (HAS_DELAY(ch))
			{
				send_to_char("Not with a wait timer.\n\r",ch);
				return FALSE;
			}

			if (!str_cmp(arg,"all"))
			{
				for(victim = ch->in_room->people; victim != NULL; victim = victim_next)
				{
					victim_next = victim->next_in_room;

					if (IS_ITEMAFF(ch, ITEMA_PEACE)) 
						continue;

					if (!IS_NPC(ch) && IS_IMMORTAL(victim)) 
						continue;

					if (!IS_NPC(ch) && !IS_AVATAR(victim))
						continue;

					if (HAS_DELAY(victim))
						continue;

					if (ch == victim)
						continue;

					if (check_disc(ch,victim,CDISC_PK|CDISC_TSAFE|CDISC_PLANE|CDISC_REINA))
						continue;

					(*power_fun)(ch,victim,argument);
				}
				return TRUE;
			}
			else if ((victim=get_char_room(ch,arg))==NULL)
			{
				send_to_char("There not here. Umm try again.\n\r",ch);
				return FALSE;
			}

			if (IS_ITEMAFF(ch, ITEMA_PEACE)) 
			{
				send_to_char("They wave thier banner of peace.. you surrender..\n\r",ch);
				return FALSE;
			}

			if (HAS_DELAY(victim))
			{
				send_to_char("They have a wait timer... you have to wait!\n\r",ch);
				return FALSE;
			}

			if (!IS_NPC(victim) && !IS_AVATAR(victim))
			{
				send_to_char("Pick on someone your own size.\n\r",ch);
				return FALSE;
			}

			if (ch == victim)
			{
				send_to_char( "You cannot do this to your self!\n\r", ch );
				return FALSE;
			}

			if (!IS_NPC(victim) && IS_IMMORTAL(victim)) 
				return FALSE;

			if (check_disc(ch,victim,CDISC_PK|CDISC_TSAFE|CDISC_PLANE|CDISC_REINA))
				return FALSE;


			(*power_fun)(ch,victim,argument);
			return TRUE;
			break;
	}

	return FALSE;

}

bool power_pool_check(CHAR_DATA *ch, int power_class, int pool_need)
{
	if (IS_NPC(ch))
		return FALSE;

	switch (power_class)
	{
		case CLASS_MAGE:
			if (ch->mana < pool_need)
			{
				send_to_char("You don't have the needed mana.\n\r",ch);
				return FALSE;
			}
			break;

		case CLASS_VAMPIRE:
			if (ch->pcdata->condition[COND_THIRST] < pool_need)
			{
				send_to_char("You don't have the blood pool needed.\n\r",ch);
				return FALSE;
			}
			break;

		case CLASS_WEREWOLF:
			break;

		case CLASS_SWWF:
			if (ch->pcdata->rage_points < pool_need)
			{
				send_to_char("You don't have the rage needed!\n\r",ch);
				return FALSE;
			}
			break;
	}

	return TRUE;

}

bool power_req_check(CHAR_DATA *ch, int power_class, int power_need, int power_level, int wwf_gift)
{
	switch (power_class)
	{
		case CLASS_MAGE:	
			/* 
			 * Example of Needed Foci check..
			 */
			if (has_sphere(ch,power_need) < power_level)
			{
				return FALSE;
			}

			if (!check_has_foci(ch,power_need, power_level))
			{
				return FALSE;
			}
			break;
		case CLASS_VAMPIRE:
			if (power_need == DISC_EVERYONE) {
				return TRUE;
			}
			if (get_disc(ch,power_need) < power_level)
				return FALSE;
			break;
		case CLASS_WEREWOLF:
			if (ch->pcdata->powers[power_need] < power_level)
				return FALSE;
			break;
		case CLASS_SWWF:
			if (power_level > get_renown(ch))
				return FALSE;

			switch (wwf_gift)
			{
				case GT_BREED:
					if (get_breed(ch,power_need) < power_level)
						return FALSE;
					break;
				case GT_AUSPICE:
					if (get_auspice(ch,power_need) < power_level)
						return FALSE;
					break;
				case GT_TRIBE:
					if (get_tribe(ch,power_need) < power_level)
						return FALSE;
					break;
			}
			break;
	}
	return TRUE;
}

void do_powers(CHAR_DATA *ch, char *argument)
{
	char    buf[MAX_STRING_LENGTH];
	char    buf2[MAX_STRING_LENGTH];
	char    arg[MSL];
	char    arg1[MSL];
	int     cmd,want_sphere,cost,gt,count,lcount=0;
	bool    fFound = FALSE, fPower = FALSE;
	

	buf[0] = '\0';
	buf2[0] = '\0';

	argument = one_argument(argument,arg);

	if (IS_NPC(ch)){
		send_to_char("huh\n\r",ch);
		return;
	}

	if (!IS_AVATAR(ch) && !IS_IMMORTAL(ch))
	{
		send_to_char("Your not a avatar! Shoo!!!\n\r",ch);
		return;
	}
	switch (ch->creature)
	{
		default:
			if (IS_SET(ch->pcdata->stats[UNI_AFF], VAM_MORTAL))
			{
				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;
			}
			//Add mortal command here for vampires... make sure they are set...
			send_to_char("You don't have any powers! SHOO!!!\n\r",ch);
			return;
			break;
		case CLASS_MAGE:
			//If No argument list power matrix
			if ( arg[0] == '\0' )
			{

				send_to_char("Current Spheres:\n\r",ch);
				sprintf(buf,"{CCorrespondence:	{Y[{c%3d{Y]	{CEntropy:	{Y[{c%3d{Y]	{CForces:	{Y[{c%3d{Y]{x\n\r",has_sphere(ch,SPHERE_CORRESPONDENCE),
						has_sphere(ch,SPHERE_ENTROPY),has_sphere(ch,SPHERE_FORCES));
				send_to_char(buf,ch);
				sprintf(buf,"{CMind:		{Y[{c%3d{Y]	{CMatter:		{Y[{c%3d{Y]	{CPrime:	{Y[{c%3d{Y]{x\n\r",has_sphere(ch,SPHERE_MIND),
						has_sphere(ch,SPHERE_MATTER),has_sphere(ch,SPHERE_PRIME));
				send_to_char(buf,ch);
				sprintf(buf,"{CSpirit:		{Y[{c%3d{Y]	{CLife:		{Y[{c%3d{Y]	{CTime:	{Y[{c%3d{Y]{x\n\r",has_sphere(ch,SPHERE_SPIRIT),
						has_sphere(ch,SPHERE_LIFE),has_sphere(ch,SPHERE_TIME));
				send_to_char(buf,ch);   
				sprintf(buf,"\n\rArete: %d\n\r",ch->arete);
				send_to_char(buf,ch);   
				send_to_char( "--------------------------------------------------------------------------------\n\r", ch );
				send_to_char("To improve a Sphere rating, type: powers improve <Sphere name>\n\r",ch);
				send_to_char("To list a Sphere rating, type: powers list <Sphere name>\n\r",ch);
				send_to_char( "--------------------------------------------------------------------------------\n\r", ch );
				return;
			}

			if (!str_cmp(arg,"improve"))
			{
				argument = one_argument( argument, arg1 );

				if (( want_sphere = sphere_lookup(arg1) ) != 666 )
					cost = (((has_sphere(ch,want_sphere) + 1) * 50) + 50);
				else
				{
					send_to_char("Available spheres:\n\r",ch);
					send_to_char("Correspondence, Entropy, Forces, Mind, Matter,\n\r",ch);
					send_to_char("Prime, Spirit, Life, and Time\n\r",ch);
					return; 
				}       

				if ( cost > ch->practice )
				{
					send_to_char("You can't afford this, you need more primal.\n\r",ch);
					return;
				}
				if ( ch->arete < (has_sphere(ch,want_sphere) + 1))
				{
					send_to_char("You must raise your Arete level.\n\r",ch);
					return; 
				}
				/* this doesnt work properly */
				if ( has_sphere(ch,want_sphere) == 0 &&  sphere_count(ch) >= 6 && ((sphere_count(ch)) > (((get_age(ch)  + 17 ) * 2) / 100) + 2))
				{
					send_to_char("You don't have the required hours to get another sphere.\n\r",ch);
					return;
				}

				ch->practice -= cost;
				ch->pcdata->spent[SPENT_P] += cost;
				ch->pcdata->discipline[want_sphere]++;
				sprintf(buf,"Your %s increases!\n\r", arg1);
				send_to_char(buf,ch);
				return;
			}

			//If "list" list the powers
			if (!strcmp(arg,"list"))
			{
				for (cmd = 0; mage_cmds[cmd].set_num  !=  0; cmd++)
				{
					if (has_sphere(ch,mage_cmds[cmd].set_type) >= mage_cmds[cmd].set_num && mage_cmds[cmd].command != NULL)
					{
						sprintf(buf,"{W({b%d{W){x %s {R%s{x\n\r",mage_cmds[cmd].set_num,mage_cmds[cmd].name,mage_cmds[cmd].command);
						send_to_char(buf,ch);   
					}
				}
				return;
			}


			for (cmd = 0; mage_cmds[cmd].set_num  !=  0; cmd++)
			{
				if (mage_cmds[cmd].command == NULL)
					continue;

				if (!str_prefix(arg,mage_cmds[cmd].command))
				{
					if (IS_EXTRA(ch,TIED_UP) && strcmp("flex",mage_cmds[cmd].command))
					{
						send_to_char("You are all tied up..\n\r",ch);
						return;
					}

					//Check power requierments.. each call has it's own.. so we do it here.
					if (!power_req_check(ch,CLASS_MAGE,mage_cmds[cmd].set_type,
								mage_cmds[cmd].set_num,
								mage_cmds[cmd].gift_type))
					{
						fPower = FALSE;
						continue;
					}
					//Check thier pool cost..
					if (!power_pool_check(ch,CLASS_MAGE,mage_cmds[cmd].pool_cost))
						return;

					//Check everything else that we need..
					if (!check_power(ch,argument,mage_cmds[cmd].command_type,CLASS_MAGE,mage_cmds[cmd].power_fun ))
					{
						fPower = FALSE;
						return;
					}
					else
						fPower = TRUE;

					//post power checks here...

					//Add Gain Paradox and Mana Drain Here
					if (!IS_NPC(ch))
						ch->mana -= mage_cmds[cmd].pool_cost;
					ch->paradox[0] += gain_paradox(ch);

					//Delay them per table
					WAIT_STATE(ch,mage_cmds[cmd].wait_time);

					return;
				}
			}
			if (!fPower)
			{
				send_to_char("Power not found, or You Don't have the req's for it.\n\r",ch);
				return;
			}
			break;

		case CLASS_WEREWOLF:
			//If No argument list power matrix
			if ( arg[0] == '\0' )
			{
				sprintf(buf,"Totems:\n\r{GBear	{g({G%d{g)	{GLynx	{g({G%d{g)	{GBoar		{g({G%d{g)\n\r{GOwl	{g({G%d{g)	{GSpider	{g({G%d{g)	{GWolf		{g({G%d{g),\n\r{GHawk	{g({G%d{g)	{GMantis	{g({G%d{g)	{GShark		{g({G%d{g)\n\r{GSphinx	{g({G%d{g)	{GRat	{g({G%d{g)	{GChameleon	{g({G%d{g).{x\n\r",
						ch->pcdata->powers[WPOWER_BEAR], ch->pcdata->powers[WPOWER_LYNX],
						ch->pcdata->powers[WPOWER_BOAR], ch->pcdata->powers[WPOWER_OWL],
						ch->pcdata->powers[WPOWER_SPIDER], ch->pcdata->powers[WPOWER_WOLF],
						ch->pcdata->powers[WPOWER_HAWK],ch->pcdata->powers[WPOWER_MANTIS],
						ch->pcdata->powers[WPOWER_SHARK],ch->pcdata->powers[WPOWER_SPHINX],
						ch->pcdata->powers[WPOWER_RAT],ch->pcdata->powers[WPOWER_CHAMELEON]);
				send_to_char(buf,ch);
				send_to_char( "--------------------------------------------------------------------------------\n\r", ch );
				send_to_char("To improve a Totem rating, type: powers improve <Totem name>\n\r",ch);
				send_to_char("To list a Totem rating, type: powers list <Totem name>\n\r",ch);
				send_to_char( "--------------------------------------------------------------------------------\n\r", ch );
				return;
			}

			if (!str_cmp(arg,"improve"))
			{
				int improve;
				int cost;
				int max;
				bool ADVANCED_TOT = FALSE;

				one_argument( argument, arg1 );

				if (!str_cmp(arg1,"bear"   ))
				{
					improve = WPOWER_BEAR;   max=5;
				}
				else if (!str_cmp(arg1,"boar"   ))
				{
					improve = WPOWER_BOAR;   max=5;
				}
				else if (!str_cmp(arg1,"lynx"   ))
				{
					improve = WPOWER_LYNX;   max=5;
				}
				else if (!str_cmp(arg1,"owl"    ))
				{
					improve = WPOWER_OWL;    max=4;
				}
				else if (!str_cmp(arg1,"spider" ))
				{
					improve = WPOWER_SPIDER; max=3;
				}
				else if (!str_cmp(arg1,"wolf"   ))
				{
					improve = WPOWER_WOLF;   max=4;
				}
				else if (!str_cmp(arg1,"hawk"   ))
				{
					improve = WPOWER_HAWK;   max=3;
				}
				else if (!str_cmp(arg1,"mantis" ))
				{
					improve = WPOWER_MANTIS; max=4;
				}
				else if (!str_cmp(arg1,"shark" ))
				{
					if (ch->pcdata->powers[WPOWER_MANTIS] < 4 || ch->pcdata->powers[WPOWER_BEAR] < 5)
					{
						send_to_char("You must have Mantis 4 and Bear 5 before you get the Shark Totem.\n\r",ch);
						return; 
					}
					ADVANCED_TOT = TRUE;
					improve = WPOWER_SHARK; max=5;

				}
				else if (!str_cmp(arg1,"sphinx" ))
				{
					if (ch->pcdata->powers[WPOWER_OWL] < 4 || ch->pcdata->powers[WPOWER_HAWK] < 3)
					{
						send_to_char("You must have Owl 4 and Hawk 3 before you get the Sphinx Totem.\n\r",ch);
						return;
					}
					ADVANCED_TOT = TRUE;
					improve = WPOWER_SPHINX; max=5;

				}
				else if (!str_cmp(arg1,"rat" ))
				{
					if (ch->pcdata->powers[WPOWER_SPIDER] < 3 || ch->pcdata->powers[WPOWER_BOAR] < 5)
					{
						send_to_char("You must have Spider 3 and Boar 5 before you get the Rat Totem.\n\r",ch);
						return;
					}
					ADVANCED_TOT = TRUE;
					improve = WPOWER_RAT; max=5;

				}
				else if (!str_cmp(arg1,"chameleon" ))
				{
					if (ch->pcdata->powers[WPOWER_LYNX] < 5 || ch->pcdata->powers[WPOWER_WOLF] < 4)
					{
						send_to_char("You must have Lynx 5 and Wolf 4 before you get the Chameleon Totem.\n\r",ch);
						return;
					}
					ADVANCED_TOT = TRUE;
					improve = WPOWER_CHAMELEON; max=5;

				}
				else
				{
					send_to_char("You can improve: Bear, Boar, Lynx, Owl, Spider, Wolf, Hawk, Mantis, Shark, Sphinx, Rat or Chameleon.\n\r",ch);
					return;
				}
				if ( ADVANCED_TOT == FALSE )
					cost = (ch->pcdata->powers[improve]+1) * COST_TOTEM;
				else
					cost = ((ch->pcdata->powers[improve]+1) * COST_TOTEM) + 50;

				arg1[0] = UPPER(arg1[0]);
				if ( ch->pcdata->powers[improve] >= max )
				{
					sprintf(buf,"You have already gained all the powers of the %s totem.\n\r", arg1);
					send_to_char(buf,ch);
					return;
				}
				if ( cost > ch->practice )
				{
					sprintf(buf,"It costs you %d primal to improve your %s totem.\n\r", cost, arg1);
					send_to_char(buf,ch);
					return;
				}
				ch->pcdata->powers[improve] += 1;
				ch->practice -= cost;
				ch->pcdata->spent[SPENT_P] += cost;
				sprintf(buf,"You improve your ability in the %s totem.\n\r", arg1);
				send_to_char(buf,ch);
			}

			//If "list" list the powers
			if (!strcmp(arg,"list"))
			{
				for (cmd = 0; wwf_tot_cmds[cmd].set_num  !=  0; cmd++)
				{
					if (ch->pcdata->powers[wwf_tot_cmds[cmd].set_type] >= wwf_tot_cmds[cmd].set_num && wwf_tot_cmds[cmd].command != NULL)
					{
						sprintf(buf,"{W({b%d{W){x %s {R%s{x\n\r",wwf_tot_cmds[cmd].set_num,wwf_tot_cmds[cmd].name,wwf_tot_cmds[cmd].command);
						send_to_char(buf,ch);   
					}
				}
				return;
			}
			//if "improve" run the improve funtion

			for (cmd = 0; wwf_tot_cmds[cmd].set_num  !=  0; cmd++)
			{
				if (wwf_tot_cmds[cmd].command == NULL)
					continue;

				if (!str_prefix(arg,wwf_tot_cmds[cmd].command))
				{
					if (IS_EXTRA(ch,TIED_UP) && strcmp("flex",wwf_tot_cmds[cmd].command))
					{
						send_to_char("You are all tied up..\n\r",ch);
						return;
					}

					//Check power requierments.. each call has it's own.. so we do it here.
					if (!power_req_check(ch,CLASS_WEREWOLF,wwf_tot_cmds[cmd].set_type,
								wwf_tot_cmds[cmd].set_num,
								wwf_tot_cmds[cmd].gift_type))
					{
						continue;

					}
					//Check thier pool cost..
					if (!power_pool_check(ch,CLASS_WEREWOLF,wwf_tot_cmds[cmd].pool_cost))
						return;

					//Check everything else that we need..
					if (!check_power(ch,argument,wwf_tot_cmds[cmd].command_type,CLASS_WEREWOLF,wwf_tot_cmds[cmd].power_fun ))
					{
						fPower = FALSE;
						return;
					}
					else
						fPower = TRUE;

					//Delay them per table
					WAIT_STATE(ch,wwf_tot_cmds[cmd].wait_time);

					return;
				}
			}
			break;

		case CLASS_VAMPIRE:
			//If No argument list power matrix
			if ( arg[0] == '\0' )
			{

				send_to_char("Current powers:\n\r",ch);
				str_cpy(buf2,"");
				str_cpy(buf,"");
				for ( count = 0 ; count < MAX_DISC ; count++ )
				{

					str_cpy(buf2,"");

					if ( get_disc(ch,count) > 0 && !IS_VAMPPASS(ch,count) )
					{
						sprintf(buf2,"{R%s	{B[{W%3d{B]{x", discipline_table[count].name, get_disc(ch,count));
						fFound = TRUE;
					}
					else if ( IS_VAMPPASS(ch,count) )
					{
						sprintf(buf2,"{R%s 	{B[{W%3d{B]{x", discipline_table[count].name_caps, get_disc(ch,count));
						fFound = TRUE;
					}

					if (strcmp(buf2,""))
					{
						lcount += 1;
						if ( lcount >= 3 )
						{
							strcat(buf,"	");
							strcat(buf, buf2);
							strcat(buf, "\n\r");
							send_to_char(buf, ch);
							lcount = 0;
							str_cpy(buf, "");
						}
						else
						{
							if ( lcount > 1 )
								strcat(buf,"	");
							strcat(buf, buf2);
						}
					}

				}

				if (fFound)
				{
					send_to_char(buf,ch);
				}
				else
					send_to_char(" None",ch);

				send_to_char("\n\r",ch);
				send_to_char( "--------------------------------------------------------------------------------\n\r", ch );
				send_to_char("To improve a Discipline rating, type: powers improve <Discipline name>\n\r",ch);
				send_to_char("To list a Discipline rating, type: powers list <Discipline name>\n\r",ch);
				send_to_char( "--------------------------------------------------------------------------------\n\r", ch );
				return;
			}

			if ( !IS_NPC(ch) && IS_SET(ch->added, ADDED_CHAMELEON))
			{
				power_chameleon(ch,ch,argument);
				return;
			}
			if (IS_EXTRA(ch,EXTRA_OSWITCH) )
			{
				power_essence(ch,ch,argument);
				return;
			}
			//If "list" list the powers
			if (!strcmp(arg,"list"))
			{
				one_argument(argument,arg1);
				for (cmd = 0; vamp_cmds1[cmd].set_num != 0;  cmd++)
				{
					if (get_disc(ch,vamp_cmds1[cmd].set_type) >= vamp_cmds1[cmd].set_num && vamp_cmds1[cmd].name != NULL && vamp_cmds1[cmd].command != NULL)
					{
						if (arg1[0] != '\0' && str_prefix(arg1,discipline_table[vamp_cmds1[cmd].set_type].name))
							continue;
						sprintf(buf,"{W({b%s %d{W){x %s {R%s{x\n\r",discipline_table[vamp_cmds1[cmd].set_type].name, vamp_cmds1[cmd].set_num,vamp_cmds1[cmd].name,vamp_cmds1[cmd].command);
						send_to_char(buf,ch);   
					}
				}
				return;
			}
			//if "improve" run the improve funtion
			if (!strcmp(arg,"improve"))
			{
				int count, discipline;
				int clancount = 0, clanmax = 10;
				int ratemax = 10;             //What the Hell is this??? - Spiral
				int cost[MAX_DISC];

				one_argument( argument, arg1 );

				if (ch->pcdata->stats[UNI_CURRENT] == -1)
				{
					for ( count = 0 ; count < MAX_DISC ; count++ )
					{
						if ( get_disc(ch,count) > 0 )
							ch->pcdata->Ninherited[count] = 1;
					}
				}

				if (ch->pcdata->stats[UNI_GEN] >= 2)
				{
					clanmax = 12;
					ratemax = 9;
				}
				if (ch->pcdata->stats[UNI_GEN] >= 3) ratemax = 8;
				if (ch->pcdata->stats[UNI_GEN] >= 4)
				{
					clanmax = UMAX( 3, ( 14 -  ch->pcdata->stats[UNI_GEN] ) );
					ratemax = 6;
				}
				if (ch->pcdata->stats[UNI_GEN] >= 5) clanmax += 1;

				//	if (ch->pcdata->stats[UNI_GEN] >= 6) ratemax = 5;
				//	if (ch->pcdata->stats[UNI_GEN] >= 8) ratemax = 4;

				if (ch->pcdata->stats[UNI_GEN] >= 7) ratemax = 5;
				if (ch->pcdata->stats[UNI_GEN] >=10) ratemax = 4;

				if (ch->pcdata->rank == AGE_ANCILLA     ) clanmax += 1;
				if (ch->pcdata->rank == AGE_ELDER       ) clanmax += 2;
				if (ch->pcdata->rank == AGE_METHUSELAH  )
				{
					ratemax += 1;
					clanmax += 3;
					//extra Disc for those Meth Vamps
				}

				for ( count = 0 ; count < MAX_DISC; count++ )
				{
					if ( get_disc(ch,count) > 0 || IS_VAMPPASS(ch,count) )
						clancount++;
				}

				if ( (discipline = discipline_lookup(arg1)) != -1 )
				{
					cost[discipline] = 0;
					if ( IS_VAMPPASS(ch,discipline) )
						cost[discipline] = ( get_disc(ch,discipline) >= ratemax ? 0 : COST_DIS * get_disc(ch,discipline) ) ;
					else
						cost[discipline] = ( get_disc(ch,discipline) >= ratemax ? 0 : COST_DIS * (get_disc(ch,discipline) + 1) + COST_DIS);

					if (ch->pcdata->disc[discipline] == 0 && ch->pcdata->Ninherited[discipline] != 1)
					{
						send_to_char("You do not own that Discipline.\n\r",ch);
						return;
					}

					if ((ch->pcdata->disc[discipline] + 1) > ratemax)
					{
						send_to_char("You cannot raise that discipline anymore.\n\r",ch);
						return;
					}
					if (ch->practice < cost[discipline])
					{
						sprintf(buf,"You do not have the requiered %d Primal.\n\r",cost[discipline]);
						send_to_char(buf,ch);
						return;
					}
					sprintf(buf,"You master the discipline of {R%s %d{x.\n\r",
							discipline_table[discipline].name,
							get_disc(ch,discipline) + 1);
					send_to_char(buf, ch);
					/*
					   clan_table_powerselect(ch,discipline_table[discipline].name);
					 */
					ch->pcdata->disc[discipline]++;
					ch->practice -= cost[discipline];
					ch->pcdata->spent[SPENT_P] += cost[discipline];
					return;
				}
				else
				{
					send_to_char( "No such discipline.\n\r", ch );
				}
				return;
			}
			for (cmd = 0; vamp_cmds1[cmd].set_num  !=  0; cmd++)
			{
				if (vamp_cmds1[cmd].command == NULL)
					continue;

				if (!str_prefix(arg,vamp_cmds1[cmd].command))
				{
					if (IS_EXTRA(ch,TIED_UP) && strcmp("flex",vamp_cmds1[cmd].command))
					{
						send_to_char("You are all tied up..\n\r",ch);
						return;
					}

					//Check power requierments.. each call has it's own.. so we do it here.
					if (!power_req_check(ch,CLASS_VAMPIRE,vamp_cmds1[cmd].set_type,
								vamp_cmds1[cmd].set_num,
								vamp_cmds1[cmd].gift_type))
					{
						continue;
					}
					//Check thier pool cost..
					if (!power_pool_check(ch,CLASS_VAMPIRE,vamp_cmds1[cmd].pool_cost))
						return;

					//Check everything else that we need..
					if (!check_power(ch,argument,vamp_cmds1[cmd].command_type,CLASS_VAMPIRE,vamp_cmds1[cmd].power_fun ))
					{
						//send_to_char("Your power failed.\n\r",ch);
						return;
					}
					//post power checks here...

					//Drain Pool...
					if (!IS_NPC(ch))
						ch->pcdata->condition[COND_THIRST] -= number_range(vamp_cmds1[cmd].pool_cost / 2, vamp_cmds1[cmd].pool_cost);
					//Delay them per table
					WAIT_STATE(ch,vamp_cmds1[cmd].wait_time);

					return;
				}
			}
			break;

		case CLASS_SWWF:
			if ( arg[0] == '\0' )
			{
				sprintf(buf,"Breed: \n\r");
				for (cmd = 0; cmd <= BREED_MAX;cmd++)
				{
					if ((ch->pcdata->breed[cmd] == -1) || (ch->pcdata->breed[cmd] > 0))
					{
						if (ch->pcdata->breed[cmd] == -1)
							gt = 0;
						else
							gt = ch->pcdata->breed[cmd];

						sprintf(buf2," {R%s{W: {W({B%d{W){x",breed_table[cmd].haunt,gt );
						if (strlen(buf) >= 70)
						{
							strcat(buf,"\n\r");
							send_to_char(buf,ch);
							strcpy(buf,buf2);
						}
						else
							strcat(buf,buf2);
					}
				}
				if (buf[0] != '\0')
				{
					strcat(buf,"\n\r");
					send_to_char(buf,ch);
				}

				sprintf(buf,"Auspice: \n\r");

				for (cmd = 0; cmd <= AUSPICE_MAX;cmd++)
				{
					if ((ch->pcdata->auspice[cmd] == -1) || (ch->pcdata->auspice[cmd] > 0))
					{
						if (ch->pcdata->auspice[cmd] == -1)
							gt = 0;
						else
							gt = ch->pcdata->auspice[cmd];

						sprintf(buf2," {R%s{W: {W({B%d{W){x",auspice_table[cmd].haunt,gt );
						if (strlen(buf) >= 70)
						{
							strcat(buf,"\n\r");
							send_to_char(buf,ch);
							strcpy(buf,buf2);
						}
						else
							strcat(buf,buf2);
					}
				}

				if (buf[0] != '\0')
				{
					strcat(buf,"\n\r");
					send_to_char(buf,ch);
				}

				sprintf(buf,"Tribe: \n\r");

				for (cmd = 0; cmd <= TRIBE_MAX;cmd++)
				{
					if ((ch->pcdata->tribes[cmd] == -1) || (ch->pcdata->tribes[cmd] > 0))
					{
						if (ch->pcdata->tribes[cmd] == -1)
							gt = 0;
						else
							gt = ch->pcdata->tribes[cmd];

						sprintf(buf2," {R%s{W: {W({B%d{W){x",tribe_table[cmd].haunt,gt );
						if (strlen(buf) >= 70)
						{
							strcat(buf,"\n\r");
							send_to_char(buf,ch);
							strcpy(buf,buf2);
						}
						else
							strcat(buf,buf2);
					}
				}

				if (buf[0] != '\0')
				{
					strcat(buf,"\n\r");
					send_to_char(buf,ch);
				}

				send_to_char( "--------------------------------------------------------------------------------\n\r", ch );
				send_to_char("To improve a gift rating, type: powers improve <gift name>\n\r",ch);
				send_to_char("To list a gift rating, type: powers list <gift name>\n\r",ch);
				send_to_char( "--------------------------------------------------------------------------------\n\r", ch );
				return;
			}
			else
			{
				if (!strcmp(arg,"improve"))
				{
					increase_gifts( ch,argument );
					return;
				}
				if (!strcmp(arg,"list"))
				{
					one_argument(argument,arg1);

					for (cmd = 0; wwf_gift_cmds[cmd].set_num  !=  0; cmd++)
					{
						//then display the commands based on Type
						switch (wwf_gift_cmds[cmd].gift_type)
						{
							default:
								break;
							case GT_BREED:
								if (get_breed(ch,wwf_gift_cmds[cmd].set_type) >= wwf_gift_cmds[cmd].set_num)
								{
									if (arg1[0] != '\0' && str_prefix(arg1,breed_table[wwf_gift_cmds[cmd].set_type].haunt))
										continue;
									sprintf(buf,"{W({b%15s%d{W){x %s {R%s{x\n\r",breed_table[wwf_gift_cmds[cmd].set_type].haunt,wwf_gift_cmds[cmd].set_num,wwf_gift_cmds[cmd].name,wwf_gift_cmds[cmd].command);
									send_to_char(buf,ch);   
								}
								break;
							case GT_AUSPICE:
								if (get_auspice(ch,wwf_gift_cmds[cmd].set_type) >= wwf_gift_cmds[cmd].set_num)
								{
									if (arg1[0] != '\0' && str_prefix(arg1,auspice_table[wwf_gift_cmds[cmd].set_type].haunt))
										continue;
									sprintf(buf,"{W({b%15s%d{W){x %s {R%s{x\n\r",auspice_table[wwf_gift_cmds[cmd].set_type].haunt,wwf_gift_cmds[cmd].set_num,wwf_gift_cmds[cmd].name,wwf_gift_cmds[cmd].command);
									send_to_char(buf,ch);   
								}
								break;
							case GT_TRIBE:
								if (get_tribe(ch,wwf_gift_cmds[cmd].set_type) >= wwf_gift_cmds[cmd].set_num)
								{
									if (arg1[0] != '\0' && str_prefix(arg1,tribe_table[wwf_gift_cmds[cmd].set_type].haunt))
										continue;
									sprintf(buf,"{W({b%15s%d{W){x %s {R%s{x\n\r",tribe_table[wwf_gift_cmds[cmd].set_type].haunt,wwf_gift_cmds[cmd].set_num,wwf_gift_cmds[cmd].name,wwf_gift_cmds[cmd].command);
									send_to_char(buf,ch);   
								}
								break;
						}
					}

				}
				for (cmd = 0; wwf_gift_cmds[cmd].set_num  !=  0; cmd++)
				{
					if (wwf_gift_cmds[cmd].command == NULL)
						continue;

					if (IS_EXTRA(ch,TIED_UP) && strcmp("flex",wwf_gift_cmds[cmd].command))
					{
						send_to_char("You are all tied up..\n\r",ch);
						return;
					}

					//Check for name first..
					if (!str_prefix(arg,wwf_gift_cmds[cmd].command))
					{
						//Check power requierments.. each call has it's own.. so we do it here.
						if (!power_req_check(ch,CLASS_SWWF,wwf_gift_cmds[cmd].set_type,
									wwf_gift_cmds[cmd].set_num,
									wwf_gift_cmds[cmd].gift_type))
							continue;

						//Check thier pool cost..
						if (!power_pool_check(ch,CLASS_SWWF,wwf_gift_cmds[cmd].pool_cost))
							return;

						//Check everything else that we need..
						if (!check_power(ch,argument,wwf_gift_cmds[cmd].command_type,CLASS_SWWF,wwf_gift_cmds[cmd].power_fun ))
						{
							//send_to_char("Your power failed.\n\r",ch);
							return;
						}
						//post power checks here...

						//Drain Pool...
						if (!IS_NPC(ch))
							ch->pcdata->rage_points -= wwf_gift_cmds[cmd].pool_cost;
						//Delay them per table
						WAIT_STATE(ch,wwf_gift_cmds[cmd].wait_time);
						return;
					}
				}

			}       
			break;

	}
	return; 
}

int gain_paradox( CHAR_DATA *ch)
{
	int paradox =0;
	CHAR_DATA *rch;

	for ( rch = ch->in_room->people; rch != NULL; rch = rch->next_in_room )
	{
		if (!IS_NPC(rch) && ch != rch && !IS_IMMORTAL(rch))
		{
			if (!IS_AVATAR(rch))
				paradox += 3;	
			else if (!IS_MAGE(rch))
				paradox += 1;
		}
	}
	return paradox;
}


int mage_affect_slot(char * command)
{
	int cmd;
	
	for ( cmd = 0; mage_affect_table[cmd].spell_name[0] != '\0'; cmd++ )
	{
		if ( !str_prefix( command, mage_affect_table[cmd].spell_name))
			return cmd;	
		
	}
	return 666;
}

int sphere_lookup(char * sphere)
{
	int cmd;
	
	for ( cmd = 0; mage_sphere_table[cmd].sphere_name[0] != '\0'; cmd++ )
	{
		if ( !str_prefix( sphere, mage_sphere_table[cmd].sphere_name))
			return cmd;	
		
	}
	return 666;
}

int obj_sphere_count(OBJ_DATA *obj)
{
	int sphere_count = 0;
	int count;
	
	for ( count = 0 ; count <= 8 ; count++ )
	{
		if ( obj->sphere[count] > 0 )
			sphere_count++;
	}
	
	return sphere_count;
	
}

int obj_has_sphere( OBJ_DATA * obj, int discipline_no )
{
	sh_int count;
	
	for ( count = 0 ; count <= 9 ; count++ )
	{
		if ( obj->sphere[discipline_no] > count )
			continue;
		else
			break;
	}
	
	return count;
}


bool check_has_foci( CHAR_DATA *ch, int Sphere_num, int Sphere_Lev)
{
	
	OBJ_DATA *obj;
	
	if (Sphere_Lev >= 2 && ((get_age(ch) - 17) * 2) <= 300)
	{
		if ( ( obj = get_obj_wear( ch, "foci" ) ) == NULL )
		{
			send_to_char("You need to be holding your Foci to use this sphere.\n\r",ch);	
			return FALSE;
		}	
		
		if (obj_has_sphere(obj, Sphere_num) < Sphere_Lev)
			return FALSE;
		
	}
	
	
	return TRUE;
}

int sphere_count(CHAR_DATA *ch)
{
	int sphere_count = 0;
	int count;
	
	for ( count = 0 ; count <= 8 ; count++ )
	{
		if ( ch->pcdata->discipline[count] > 0 )
			sphere_count++;
	}
	return sphere_count;
	
}
/*250 mana duration 10 * sphere rate*/

const	struct	mage_clan_type	mage_clan_table		[]		=
{
	{ "OrderHermes",CLAN_ORDER_OF_HERMES,	SECT_TRADITIONS,	SPHERE_FORCES, 	"Merlin" },
	{ "Verbena",CLAN_VERBENA,		SECT_TRADITIONS,			SPHERE_LIFE,   	"Merlin" },
	{ "Dreamspeakr",CLAN_DREAMSPEAKERS,	SECT_TRADITIONS,		SPHERE_SPIRIT, 	"Merlin" },
	{ "CultEcstacy",CLAN_CULT_OF_ECSTASY,	SECT_TRADITIONS,	SPHERE_TIME,   	"Merlin" },
	{ "Akashic    ",CLAN_AKASHIC_BROTHERHOOD,    SECT_TRADITIONS,	SPHERE_MIND,"Merlin" },
	{ "CelestrialC",CLAN_CELESTRIAL_CHORUS,    SECT_TRADITIONS,	SPHERE_MIND,	"Merlin" },
	{ "Euthanatos ",CLAN_EUTHANATOS,    SECT_TRADITIONS,		SPHERE_MIND, 	"Merlin" },
	{ "HollowOnes ",CLAN_HOLLOW_ONES,    SECT_TRADITIONS,		SPHERE_MIND, 	"Merlin" },
	{ "SonsofEther",CLAN_SONS_OF_ETHER,    SECT_TRADITIONS,		SPHERE_MIND, 	"Merlin" },
	{ "IterationX ",CLAN_ITERATION_X,    SECT_TRADITIONS,		SPHERE_MIND, 	"Merlin" },
	{ "Progenitors",CLAN_PROGENITORS,    SECT_TRADITIONS,		SPHERE_MIND, 	"Merlin" },
	{ "Syndicate  ",CLAN_SYNDICATE,    SECT_TRADITIONS,			SPHERE_MIND, 	"Merlin" },
	{ "NewWorldOrd",CLAN_NEW_WORLD_ORDER,    SECT_TRADITIONS,	SPHERE_MIND,	"Merlin" },
	{ "VoidEnginer",CLAN_VOID_ENGINEERS,    SECT_TRADITIONS,	SPHERE_MIND,	"Merlin" },
};

void do_mage( CHAR_DATA *ch, char *argument )
{
	char      arg [MAX_INPUT_LENGTH];
	argument = one_argument( argument, arg );
	
	if (IS_NPC(ch)) return;
	
	if (IS_IMMUNE(ch, IMM_MAGE))
	{
		send_to_char("You will now allow mages to teach you.\n\r",ch);
		REMOVE_BIT(ch->immune, IMM_MAGE);
		return;
	}
	send_to_char("You will no longer allow mages to teach you.\n\r",ch);
	SET_BIT(ch->immune, IMM_MAGE);
	return;
}

int mage_iclan_lookup (const char *name)
{
	int vamp_clan;
	
	for ( vamp_clan = 0; vamp_clan < MAX_MAGE_CLAN ;vamp_clan++)
	{
		if (LOWER(name[0]) == LOWER(iclan_table[vamp_clan].pretty_name[0])
			&&  !str_prefix( name,iclan_table[vamp_clan].pretty_name ))
			return vamp_clan;
	}
	
	return -1;
}

int mage_clan_lookup (const char *name)
{
	int vamp_clan;
	
	for ( vamp_clan = 0; vamp_clan < MAX_MAGE_CLAN ;vamp_clan++)
	{
		if (LOWER(name[0]) == LOWER(mage_clan_table[vamp_clan].name[0])
			&&  !str_prefix( name,mage_clan_table[vamp_clan].name ))
			return vamp_clan;
	}
	
	return -1;
}



void do_sphereaffects( CHAR_DATA *ch, char *argument )
{
	char buf[MAX_STRING_LENGTH];
	SPHERE_DATA *paf;
	
	if ( ch->sphere_affected != NULL )
	{
		send_to_char( "\n\r{CYou are affected by the following sphere affects:{x\n\r\n\r", ch );
		for ( paf = ch->sphere_affected; paf != NULL; paf = paf->next )
		{
			sprintf( buf, "{M%21s{x", mage_affect_table[paf->spell_number].spell_name );
			
			send_to_char( buf, ch );
			
			if ( ch->level >= 0 )
			{
				sprintf( buf, " for {W%4d{x hrs", paf->duration );
				send_to_char( buf, ch );
			}
			
			send_to_char( "\n\r", ch );
		}
	}
	else 
		send_to_char("\n\r{CYou are not affected by any other sphere affects.{x\n\r",ch);
	
	return;
}
 
bool create_foci(CHAR_DATA *ch, OBJ_DATA *obj, int want_sphere)
{
	if ( (ch->arete - 1 ) < (obj_sphere_count(obj) + 1) )
	{
		send_to_char("You need more Arete to add another sphere.\n\r",ch);
		return FALSE;
	}
	obj->item_type = ITEM_FOCI;
	obj->sphere[want_sphere] = ch->arete;
	return TRUE;
}

void do_teach( CHAR_DATA *ch, char *argument )
{
	CHAR_DATA *victim;
	char      arg1 [MAX_INPUT_LENGTH];
	char      arg2 [MAX_INPUT_LENGTH];
	char      buf [MAX_INPUT_LENGTH];
	sh_int    count;
	sh_int    clan = -1,iclan = 0;
	int       spell_count;
	
	argument = one_argument( argument, arg1);
	argument = one_argument( argument, arg2);
	
	if (IS_NPC(ch)) return;
	
	if (!IS_CLASS(ch, CLASS_MAGE) && !IS_IMMORTAL(ch))
	{
		send_to_char("Huh?\n\r",ch);
		return;
	}
	
    if (IS_IMMORTAL(ch) && ch->level <= LEVEL_JUDGE) 
    {
    	send_to_char("Huh?\n\r",ch);
		return;
    }
	
	if (!IS_SET(ch->special, SPC_PRINCE) && !IS_IMMORTAL(ch))
	{
		send_to_char("You are not able to create any apprentices.\n\r",ch);
		return;
	}
	
	if (ch->clan == CLAN_NONE && !IS_IMMORTAL(ch))
	{
		send_to_char( "First you need to found a clan.\n\r", ch );
		return;
	}
	
	if ( arg1[0] == '\0' )
	{
		send_to_char( "Who do you want to make an apprentice?\n\r", ch );
		return;
	}
	
	
	if ( ( victim = get_char_room( ch, arg1 ) ) == NULL )
	{
		send_to_char( "They aren't here.\n\r", ch );
		return;
	}
	
	if ( IS_NPC(victim) )
	{
		send_to_char( "Not on NPC's.\n\r", ch );
		return;
	}
	
	if ( victim->max_mana < 10000 )
	{
		send_to_char("They don't have the required 10,000 mana.\n\r",ch);
		return;	
	}
	
	for ( spell_count = 0; spell_count >= 5; spell_count++ )
	{
		if (victim->spl[spell_count] < 200 )
		{
			send_to_char("They are not ready for your training in the magical arts.\n\r",ch);
			return;	
		}
	}
	
	if ( ch == victim )
	{
		send_to_char( "You cannot make yourself a Mage.\n\r", ch );
		return;
	}
	
	if (IS_CLASS(victim, CLASS_WRAITH))
	{
		send_to_char( "You cannot turn wraiths in to Mages.\n\r", ch );
		return;
	}

	if (IS_CLASS(victim, CLASS_VAMPIRE))
	{
		send_to_char( "You cannot turn vampires in to Mages.\n\r", ch );
		return;
	}
	
	if ( victim->level != LEVEL_AVATAR && !IS_IMMORTAL(victim) )
	{
		send_to_char( "You can only teach avatars.\n\r", ch );
		return;
	}

	if (IS_SWWF(victim))
	{
		send_to_char("Do I really have to tell you that you can't do this?\n\r",ch);
		return;
	}


	if (IS_CLASS(victim, CLASS_WEREWOLF))
	{
		send_to_char( "You are unable to create weremages!!\n\r", ch );
		send_to_char( "Although that would be kewl as hell. -S\n\r", ch );
		return;
	}
	
	if (IS_CLASS(victim, CLASS_MAGE))
	{
		send_to_char( "But they are already a mage!\n\r", ch );
		return;
	}
	
	if (IS_IMMUNE(victim,IMM_MAGE))
	{
		send_to_char( "You cannot teach an unwilling person.\n\r", ch );
		return;
	}
	
	if (ch->clan == CLAN_NONE && ch->level < 4 )
	{
		send_to_char("You cannot create any apprentices.\n\r",ch);
		return;
	}
	
	if (ch->exp < 1000000)
	{
		send_to_char("You cannot afford the 1,000,000 exp to create an apprentice.\n\r",ch);
		return;
	}
	
	for ( count = 0 ; count < MAX_SPHERE ; count++ )
	{
		if ( has_sphere(victim,count) > 0 || IS_VAMPPASS(victim,count) )
			return;          
	}
	
	if ( IS_IMMORTAL(ch) )
	{
		if ( arg2[0] == '\0' )
		{
			send_to_char("Usage: teach <player> <clan|'random'>\n\r",ch);
			return;
		}
		
		if ( (clan = mage_clan_lookup(arg2)) == -1)
		{
			if (!str_cmp(arg2,"random"))
				clan = number_range(0,MAX_MAGE_CLAN - 1);
			else
			{
				send_to_char("Usage: teach <player> <clan|'random'>\n\r",ch);
				return;
			}
		}
		if ( (iclan = mage_iclan_lookup(arg2)) == -1)
		{
			if (!str_cmp(arg2,"random"))
				iclan = number_range(0,MAX_MAGE_CLAN - 1);
			else
			{
				send_to_char("Usage: teach <player> <clan|'random'>\n\r",ch);
				return;
			}
		}
	}    
	
	ch->exp = ch->exp - 100000;
	act("You teach $N the ways of your clan.", ch, NULL, victim, TO_CHAR);
	act("$n starts to talk about things that you don't understand.", ch, NULL, victim, TO_NOTVICT);
	act("You are taught the ways of $n's clan.", ch, NULL, victim, TO_VICT);
	victim->creature=CLASS_MAGE;
	
	send_to_char( "You are now a mage.\n\r", victim );    
	victim->pcdata->stats[UNI_GEN] = (IS_IMMORTAL(ch) ? 4 : ch->pcdata->stats[UNI_GEN] + 1);
	
	
	sprintf(buf,"%s %s",ch->lord->str,ch->name->str);
	victim->lord = g_string_assign(victim->lord,buf);
	
	if ( clan == -1 )
	{
		if (victim->pcdata->stats[UNI_CURRENT] == -1) 
		{
			for ( count = 0 ; count < MAX_SPHERE ; count++ )
			{
				if ( has_sphere(victim,count) < 0 )
					victim->pcdata->inherited[count] = 1;
			}
		}

		if ( (clan = mage_clan_lookup(iclan_table[ch->clan].pretty_name)) != -1)
		{
			victim->pcdata->discipline[mage_clan_table[clan].sphere] = 1;
		
			victim->clan = clan;
		
			victim->sect = mage_clan_table[clan].sect;
		}
	}
	else 
	{
		if (victim->pcdata->stats[UNI_CURRENT] == -1) 
		{
			for ( count = 0 ; count < MAX_SPHERE ; count++ )
			{
				if ( has_sphere(victim,count) < 0 )
					victim->pcdata->inherited[count] = 1;
			}
		}
		
	/* Remove any old powers they might have */
		for ( count = 0 ; count < MAX_SPHERE ; count++ )
		{
			victim->pcdata->discipline[count] = 0;
		}
		
		if ( (clan = mage_clan_lookup(iclan_table[ch->clan].pretty_name)) != -1)
		{
			victim->sect = mage_clan_table[clan].sect;
		}
		
	/* Give the vampire the base powers of their sire */
		for ( count = 0 ; count < MAX_SPHERE; count++ )
		{
			if ( ch->pcdata->inherited[count] )
			{
				victim->pcdata->inherited[count] = 1;
				victim->pcdata->discipline[count] = 1;
			}
		}
		victim->clan = iclan;
	}

	if (IS_IMMORTAL(ch))
		victim->sect = SECT_INDEPENDENT;
	else
		victim->sect = ch->sect;

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

/*******************************************************************************
			    Maint Utilitys  
*******************************************************************************/
bool check_disc(CHAR_DATA *ch, CHAR_DATA *victim, int flag)
{
	if ( IS_SET(flag,CDISC_PK))
	{
		if (check_pk(ch,victim,CHECK_DELAY|CHECK_ATTACK))
			return TRUE;
	}
	if (IS_SET(flag,CDISC_REINA))
	{
		if (IS_RAFFECTED(ch->in_room, ROOM_AFF_REINA ))
		{
			send_to_char("This room is a temporary safe haven. You don't wanna do that here.\n\r",ch);
			return TRUE;
		}
	}
	if (IS_SET(flag,CDISC_PLANE))
	{
		if (!is_same_plane(ch,victim))
		{	
			send_to_char("The target must be on the same plane.\n\r",ch);
			return TRUE;
		}
	}
	if (IS_SET(flag,CDISC_TSAFE))
	{
		if (IS_ITEMAFF(ch,ITEMA_PEACE) )
    		return TRUE;

    	if (IS_ITEMAFF(victim,ITEMA_PEACE) )
    		return TRUE;

		if ( check_safe_imm(ch) )
			return TRUE;
		
		if (is_tempsafe(ch))
		{
			send_to_char("Not in safe rooms.\n\r",ch);
			return TRUE;
		}
	}
	
	return FALSE;
}
bool count_gifts( CHAR_DATA *ch )
{
	int ch_age = (get_age(ch) - 17) * 2;  /* hours calculation */
	int ccount = 0;
	int sn = 0;
	int agebonus =0;
	
	for ( sn = 0; sn <= BREED_MAX; sn++ )
	{
		if (ch->pcdata->breed[sn] == -1 || ch->pcdata->breed[sn] > 0)
			ccount += 1;	
	}
	for ( sn = 0; sn <= AUSPICE_MAX; sn++ )
	{
		if (ch->pcdata->auspice[sn] == -1 || ch->pcdata->auspice[sn] > 0)
			ccount += 1;	
	}
	for ( sn = 0; sn <= TRIBE_MAX; sn++ )
	{
		if (ch->pcdata->tribes[sn] == -1 || ch->pcdata->tribes[sn] > 0)
			ccount += 1;	
	}
	
	if      (ch_age >=  400) agebonus++;
    if      (ch_age >=  800) agebonus++;
    if      (ch_age >= 1500) agebonus++;
		
    if ((ccount - agebonus) > 6 )
		return TRUE;

	return FALSE;
}

void do_teachgift( CHAR_DATA *ch, char *argument )
{
    char buf  [MAX_INPUT_LENGTH];
    char arg1 [MAX_INPUT_LENGTH];
    char arg2 [MAX_INPUT_LENGTH];
    CHAR_DATA *victim;
    int improve, col, gtype;
	
	char	buf2[MAX_STRING_LENGTH];
	int 	cmd,gt;
	
    smash_tilde(argument);
    argument = one_argument( argument, arg1 );
    str_cpy(arg2,argument);

    if (IS_NPC(ch)) return;

    if (!IS_SWWF(ch) && !IS_IMMORTAL(ch) )
    {
	send_to_char("Huh?\n\r",ch);
	return;
    }

    if ( arg1[0] == '\0' || arg2[0] == '\0' )
    {
	send_to_char( "Syntax: teach <person> <gift>\n\r", ch );
	send_to_char( "The following list contains your gifts and the level you can teach to.\n\r", ch );
	send_to_char( "--------------------------------------------------------------------------------\n\r", ch );

	col    = 0;
        sprintf(buf,"Breed: \n\r");
        send_to_char(buf,ch);
        
        for (cmd = 0; cmd <= BREED_MAX;cmd++)
        {
            if (ch->pcdata->breed[cmd] > 2)
            {
                if (ch->pcdata->breed[cmd] == -1)
                    gt = 0;
                else
                    gt = ch->pcdata->breed[cmd];

                sprintf(buf2," {R%s{W: {W({B%d{W){x",breed_table[cmd].haunt,gt );
                if (strlen(buf) >= 70)
                {
                    strcat(buf,"\n\r");
                    send_to_char(buf,ch);
                    strcpy(buf,buf2);
                }
                else
                    strcat(buf,buf2);
            }
        }
        if (buf[0] != '\0')
        {
            strcat(buf,"\n\r");
            send_to_char(buf,ch);
        }

        sprintf(buf,"Auspice: \n\r");
        send_to_char(buf,ch);

        for (cmd = 0; cmd <= AUSPICE_MAX;cmd++)
        {
            if (ch->pcdata->auspice[cmd] > 2)
            {
                if (ch->pcdata->auspice[cmd] == -1)
                    gt = 0;
                else
                    gt = ch->pcdata->auspice[cmd];

                sprintf(buf2," {R%s{W: {W({B%d{W){x",auspice_table[cmd].haunt,gt );
                if (strlen(buf) >= 70)
                {
                    strcat(buf,"\n\r");
                    send_to_char(buf,ch);
                    strcpy(buf,buf2);
                }
                else
                    strcat(buf,buf2);
            }
        }

        if (buf[0] != '\0')
        {
            strcat(buf,"\n\r");
            send_to_char(buf,ch);
        }

        sprintf(buf,"Tribe: \n\r");
        send_to_char(buf,ch);

        for (cmd = 0; cmd <= TRIBE_MAX;cmd++)
        {
            if (ch->pcdata->tribes[cmd] > 2)
            {
                if (ch->pcdata->tribes[cmd] == -1)
                    gt = 0;
                else
                    gt = ch->pcdata->tribes[cmd];

                sprintf(buf2," {R%s{W: {W({B%d{W){x",tribe_table[cmd].haunt,gt );
                if (strlen(buf) >= 70)
                {
                    strcat(buf,"\n\r");
                    send_to_char(buf,ch);
                    strcpy(buf,buf2);
                }
                else
                    strcat(buf,buf2);
            }
        }
        
        if (buf[0] != '\0')
        {
            strcat(buf,"\n\r");
            send_to_char(buf,ch);
        }


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

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

    if ( ch == victim )
    {
	send_to_char( "You cannot teach yourself!\n\r", ch );
	return;
    }
	
	if (IS_IMMUNE(victim,IMM_WEREWOLF))
	{
		send_to_char( "You cannot teach to a unwilling person.\n\r", ch );
		return;
	}
	
    if (IS_NPC(victim))
    {
	send_to_char( "Not on NPC's.\n\r", ch );
	return;
    }

    if (!str_cmp(arg2,"homid")) 
	{improve = BREED_HOMID;gtype = 0;}
    else if (!str_cmp(arg2,"lupus")) 
	{improve = BREED_LUPUS;gtype = 0;}
    else if (!str_cmp(arg2,"metis")) 
	{improve = BREED_METIS;gtype = 0;}
    else if (!str_cmp(arg2,"ragabash")) 
	{improve = AUSPICE_RAGABASH;gtype = 1;}
    else if (!str_cmp(arg2,"theurge")) 
	{improve = AUSPICE_THEURGE;gtype = 1;}
    else if (!str_cmp(arg2,"philodox")) 
	{improve = AUSPICE_PHILODOX;gtype = 1;}
    else if (!str_cmp(arg2,"galliard")) 
	{improve = AUSPICE_GALLIARD;gtype = 1;}
    else if (!str_cmp(arg2,"ahroun")) 
	{improve = AUSPICE_AHROUN;gtype = 1;}
    else if (!str_cmp(arg2,"black furies")) 
	{improve = TRIBE_BLACK_FURIES;gtype = 2;}
    else if (!str_cmp(arg2,"bone gnawers")) 
	{improve = TRIBE_BONE_GNAWERS;gtype = 2;}
    else if (!str_cmp(arg2,"children of gaia")) 
	{improve = TRIBE_CHILDREN_OF_GAIA;gtype = 2;}
    else if (!str_cmp(arg2,"child of spiral")) 
	{improve = TRIBE_CHILD_OF_SPIRAL;gtype = 2;}
    else if (!str_cmp(arg2,"fianna")) 
	{improve = TRIBE_FIANNA;gtype = 2;}
    else if (!str_cmp(arg2,"get of fenris")) 
	{improve = TRIBE_GET_OF_FENRIS;gtype = 2;}
    else if (!str_cmp(arg2,"get of fenris")) 
	{improve = TRIBE_GET_OF_FENRIS;gtype = 2;}
    else if (!str_cmp(arg2,"glass walkers")) 
	{improve = TRIBE_GLASS_WALKERS;gtype = 2;}
    else if (!str_cmp(arg2,"red talons")) 
	{improve = TRIBE_RED_TALONS;gtype = 2;}
    else if (!str_cmp(arg2,"shadow lords")) 
	{improve = TRIBE_SHADOW_LORDS;gtype = 2;}
    else if (!str_cmp(arg2,"silent striders")) 
	{improve = TRIBE_SILENT_STRIDERS;gtype = 2;}
    else if (!str_cmp(arg2,"silver fangs")) 
	{improve = TRIBE_SILVER_FANGS;gtype = 2;}
    else if (!str_cmp(arg2,"stargazers")) 
	{improve = TRIBE_STARGAZERS;gtype = 2;}
    else if (!str_cmp(arg2,"uktena")) 
	{improve = TRIBE_UKTENA;gtype = 2;}
    else if (!str_cmp(arg2,"wendigos")) 
	{improve = TRIBE_WENDIGO;gtype = 2;}
    else
    {
	send_to_char("You know of no such gift.\n\r",ch);
	return;
    }

	if (get_renown(ch) < 3 && !IS_IMMORTAL(ch)){
		send_to_char("You require 3 Renown to teach gifts.\n\r",ch);
		return;
	}

    switch (gtype)
    {
	default:
	    if (ch->pcdata->breed[improve] == 0 && !IS_IMMORTAL(ch))
	    {
		send_to_char("You know of no such breed power.\n\r",ch);
		return;
	    }
	    if (ch->pcdata->breed[improve] < 3 && !IS_IMMORTAL(ch))
	    {
		send_to_char("You require level 3 in a gift before you can teach it.\n\r",ch);
		return;
	    }
	    break;
	case 1:
	    if (ch->pcdata->auspice[improve] == 0 && !IS_IMMORTAL(ch))
	    {
		send_to_char("You know of no such auspice power.\n\r",ch);
		return;
	    }
	    if (ch->pcdata->auspice[improve] < 3 && !IS_IMMORTAL(ch))
	    {
		send_to_char("You require level 3 in a gift before you can teach it.\n\r",ch);
		return;
	    }
	    break;
	case 2:
		if (!IS_SET(ch->special, SPC_PRINCE) && !IS_SET(ch->special, SPC_BETA)){
			send_to_char("You must be a Alpha or Beta to teach tribal gifts.\n\r",ch);
			return;
		}
		
		if (ch->pcdata->tribes[improve] == 0 && !IS_IMMORTAL(ch))
	    {
			send_to_char("You know of no such tribe power.\n\r",ch);
			return;
	    }
	    if (ch->pcdata->tribes[improve] < 3 && !IS_IMMORTAL(ch))

	    {
			send_to_char("You require level 3 in a gift before you can teach it.\n\r",ch);
			return;
	    }
	    break;
    }

    if (!IS_SWWF(victim))
    {
	send_to_char("They are unable to learn gifts.\n\r",ch);
	return;
    }

    if (!IS_IMMUNE(victim, IMM_VAMPIRE))
    {
	send_to_char("They refuse to learn any gifts.\n\r",ch);
	return;
    }

	if (count_gifts(victim))
	{
		send_to_char("They cannot have anymore gifts.\n\r",ch);
		return;
	}

    switch (gtype)
    {
	default:
	    if (victim->pcdata->breed[improve] != 0 )
	    {
		send_to_char("They already know that gift.\n\r",ch);
		return;
	    }
	    victim->pcdata->breed[improve] = -1;
	    break;
	case 1:
	    if (victim->pcdata->auspice[improve] != 0)
	    {
		send_to_char("They already know that gift.\n\r",ch);
		return;
	    }
	    victim->pcdata->auspice[improve] = -1;
	    break;
	case 2:
	    if (victim->pcdata->tribes[improve] != 0 )
	    {
		send_to_char("They already know that gift.\n\r",ch);
		return;
	    }
	    victim->pcdata->tribes[improve] = -1;
	    break;
    }

    sprintf(buf,"You teach $N how to use the %s gift.",capitalize(arg2));
    act(buf,ch,NULL,victim,TO_CHAR);
    sprintf(buf,"$n teaches you how to use the %s gift.",capitalize(arg2));
    act(buf,ch,NULL,victim,TO_VICT);
    return;
}
int tribe_lookup (const char *name)
{
	int tribe;
	
	for ( tribe = 0; tribe < MAX_ICLAN ;tribe++)
	{
		if (LOWER(name[0]) == LOWER(iclan_table[tribe].pretty_name[0])
			&&  !str_prefix( name,iclan_table[tribe].pretty_name ))
			return tribe;
	}
	
	return -1;
}

void do_spclaw( CHAR_DATA *ch, char *argument )
{
    CHAR_DATA *victim;
    char      arg [MAX_INPUT_LENGTH];
    char      arg2 [MAX_INPUT_LENGTH];
    char      buf [MAX_INPUT_LENGTH];
    int       tribe = -1;
	int		  brand,arand;
    bool     can_sire;

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

    if (IS_NPC(ch)) 
    	return;

    if (!IS_SWWF(ch) && !IS_IMMORTAL(ch) )
    {
		send_to_char("huh?",ch);
        return;
    }
    
    if (IS_IMMORTAL(ch) && ch->level <= LEVEL_JUDGE) 
    {
    	send_to_char("Huh?\n\r",ch);
		return;
    }


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

    if ( ( victim = get_char_room( ch, arg ) ) == NULL )
    {
	send_to_char( "They aren't here.\n\r", ch );
	return;
    }
    
    if (IS_SET(ch->special, SPC_BETA)
        ||  IS_SET(ch->special, SPC_PRINCE)) can_sire = TRUE;
    else can_sire = FALSE;


    if (!can_sire)
    {
        send_to_char("You are unable to spread your gift.\n\r",ch);
        return;
    }


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

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

    if (IS_MAGE(victim))
    {
	send_to_char( "You cannot claw mages.\n\r", ch );
	return;
    }

    if (IS_CLASS(ch,CLASS_WRAITH))
    {
	send_to_char( "You are unable to create werewraiths!\n\r", ch );
	return;
    }

    if (IS_VAMPIRE(victim))
    {
	send_to_char( "You are unable to create werevamps!\n\r", ch );
	return;
    }

    if (IS_WEREWOLF(victim) || IS_SWWF(victim))
    {
	send_to_char( "You already notice that they are really furry!\n\r", ch );
	return;
    }

    if (IS_IMMUNE(victim,IMM_WEREWOLF))
	{
		send_to_char( "You cannot claw an unwilling person.\n\r", ch );
		return;
	}
	
	if (!IS_VAMPAFF(ch,VAM_CLAWS) && !IS_IMMORTAL(ch))
    {
	send_to_char("First you better get your claws out!\n\r",ch);
	return;
    }

	if ( IS_IMMORTAL(ch) )
	{
		if ( arg2[0] == '\0' )
		{
			send_to_char("Usage: claw <player> <tribe|'random'>\n\r",ch);
			return;
		}
		
		if ( (tribe = tribe_lookup(arg2)) == -1)
		{
			if (!str_cmp(arg2,"random"))
				tribe = number_range(0,TRIBE_MAX - 1);
			else
			{
				send_to_char("Usage: clan <player> <tribe|'random'>\n\r",ch);
				return;
			}
		}
	}    

    act("You plunge your claws into $N.", ch, NULL, victim, TO_CHAR);
    act("$n plunges $s claws into $N.", ch, NULL, victim, TO_NOTVICT);
    act("$n plunges $s claws into your chest.", ch, NULL, victim, TO_VICT);
    victim->creature = CLASS_SWWF;
    victim->level = LEVEL_AVATAR;

	brand = number_range(0,2);
	arand = weather_info[ch->in_room->sector_type].moon;
    
    victim->pcdata->breed[brand] = -1;
    victim->pcdata->auspice[arand] = -1;

	victim->pcdata->sgift[1] = brand;
	victim->pcdata->sgift[2] = arand;
	
	switch (victim->pcdata->sgift[2])
	{
		case AUSPICE_RAGABASH:
			victim->pcdata->renown[RENOWN_HONOR] = ragabash_table[1].honor; 
			victim->pcdata->renown[RENOWN_GLORY] = ragabash_table[1].glory;
			victim->pcdata->renown[RENOWN_WISDOM] = ragabash_table[1].wisdom;
		break;
		case AUSPICE_THEURGE:
			victim->pcdata->renown[RENOWN_HONOR] = theurge_table[1].honor; 
			victim->pcdata->renown[RENOWN_GLORY] = theurge_table[1].glory;
			victim->pcdata->renown[RENOWN_WISDOM] = theurge_table[1].wisdom;
		break;
		case AUSPICE_PHILODOX:
			victim->pcdata->renown[RENOWN_HONOR] = philodox_table[1].honor; 
			victim->pcdata->renown[RENOWN_GLORY] = philodox_table[1].glory;
			victim->pcdata->renown[RENOWN_WISDOM] = philodox_table[1].wisdom;
		break;
		case AUSPICE_GALLIARD:
			victim->pcdata->renown[RENOWN_HONOR] = galliard_table[1].honor; 
			victim->pcdata->renown[RENOWN_GLORY] = galliard_table[1].glory;
			victim->pcdata->renown[RENOWN_WISDOM] = galliard_table[1].wisdom;
		break;
		case AUSPICE_AHROUN:
			victim->pcdata->renown[RENOWN_HONOR] = ahroun_table[1].honor; 
			victim->pcdata->renown[RENOWN_GLORY] = ahroun_table[1].glory;
			victim->pcdata->renown[RENOWN_WISDOM] = ahroun_table[1].wisdom;
		break;
	}



	send_to_char( "You thrash the cowering form beneath you, raking your claws along it's soul.\n\r", ch )
;
    send_to_char( "Then, in the final death throes, you chomp it's neck, tearing out it's essence.\n\r", ch );
    send_to_char( "You breathe your Tribal strength into the bloody corpse.\n\r", ch );
    send_to_char( "They are now forever submissive to your tribe!\n\r", ch );

    send_to_char( "You feel your soul ripped asunder as the Garou Claws your very soul to shreds!!\n\r", victim );
    send_to_char( "As it tears your throat out, and you begin to submit to death itself.\n\r", victim );
    send_to_char( "You suddenly feel a strong, earthly essence overcome your soul.\n\r", victim );
    send_to_char( "As the strength of the Garou begins to fill your veins, your mind is flooded \n\r", victim );
    send_to_char( "with the sudden knowledge of Tribal power and everlasting loyalty to the Eldest.\n\r",
victim );

    act( "$n suddenly reaches out and claws $N to shreds!", ch, NULL, victim, TO_NOTVICT );
    act( "$n then takes $N's throat in $s mouth, and tears it out!", ch, NULL, victim, TO_NOTVICT );
    act( "$N goes into convulsions, then slowly steadies, then peers up at $n with adoration.", ch, NULL,
victim, TO_NOTVICT );

    send_to_char( "You are now a werewolf.\n\r", victim );
    
	sprintf(buf,"%s has been mauled by a pack of wolves!",victim->name->str);
	do_info(ch,buf);
	
	victim->pcdata->stats[UNI_GEN] = ch->pcdata->stats[UNI_GEN] + 1;
    
    if (ch->pcdata->stats[UNI_GEN] == 1)
		victim->lord = g_string_assign(victim->lord,ch->name->str);
	else
    {
		sprintf(buf,"%s %s",ch->lord->str,ch->name->str);
		victim->lord = g_string_assign(victim->lord,buf);
	}

    if ( IS_IMMORTAL(ch) && tribe != -1 )
    {
		victim->clan = tribe;
        victim->pcdata->tribes[iclan_table[tribe].number] = 1;
    	victim->pcdata->sgift[3] = iclan_table[tribe].number;
    	victim->sect = SECT_INDEPENDENT;
    }
    
    if (!IS_IMMORTAL(ch))
    {
		victim->clan=ch->clan;
        victim->pcdata->tribes[iclan_table[ch->clan].number] = 1;
    	victim->pcdata->sgift[3] = ch->pcdata->sgift[iclan_table[ch->clan].number];
		victim->sect = ch->sect;
    }
	
	sprintf(buf,"I am %s, loyal to tribe %s and to sept %s.",victim->name->str,iclan_table[victim->clan].pretty_name,sect_table[victim->sect].pretty_name);
	do_say(victim,buf);
	
	SET_BIT(victim->immune,IMM_WEREWOLF);
	
    do_autosave(ch,"");
    do_autosave(victim,"");
    return;
}
void do_learn_gift( CHAR_DATA *ch, char *argument)
{
	CHAR_DATA *teacher;
	bool tFound = FALSE;
	char arg1[MAX_STRING_LENGTH];
	char buf[MAX_STRING_LENGTH];
	int improve, gtype;
	GSList *desc_list = descriptor_list;
	DESCRIPTOR_DATA *d;
	CHAR_DATA *wch;
	
        smash_tilde(argument);
	one_argument(argument,arg1);
	
	if (!IS_SWWF(ch) )
    	{
		send_to_char("Huh?\n\r",ch);
		return;
    	}
	
	for (teacher = ch->in_room->people; teacher != NULL; teacher = teacher->next_in_room)
	{
		if (IS_NPC(teacher) && IS_SET(teacher->mob_con, MOBCON_TEACHER))
			tFound = TRUE;
	}
	
	
	if (tFound == FALSE)
	{
		send_to_char("You don't see a teacher here.\n\r",ch);
		return;
	}


    if ( arg1[0] == '\0' )
    {
	send_to_char( "Syntax: learngift <gift>\n\r", ch );
	send_to_char( "Cost of Learning: 10 Roleplaying Points\n\r", ch);
	return;
    }

    while ( desc_list != NULL )
    {
    	d = (DESCRIPTOR_DATA*)desc_list->data;
	    wch = d->character;
	    if (IS_SWWF(wch) && wch != ch)
	    {
	    	do_say(teacher,"There are others that you can learn from, leave me be.");
			g_slist_free(desc_list);
		    return;
	    }
	    desc_list = g_slist_next(desc_list);
	}
	g_slist_free(desc_list);
		

    if (!str_cmp(arg1,"homid"))
	{improve = BREED_HOMID;gtype = 0;}
    else if (!str_cmp(arg1,"lupus"))
	{improve = BREED_LUPUS;gtype = 0;}
    else if (!str_cmp(arg1,"metis"))
	{improve = BREED_METIS;gtype = 0;}
    else if (!str_cmp(arg1,"ragabash"))
	{improve = AUSPICE_RAGABASH;gtype = 1;}
    else if (!str_cmp(arg1,"theurge"))
	{improve = AUSPICE_THEURGE;gtype = 1;}
    else if (!str_cmp(arg1,"philodox"))
	{improve = AUSPICE_PHILODOX;gtype = 1;}
    else if (!str_cmp(arg1,"galliard"))
	{improve = AUSPICE_GALLIARD;gtype = 1;}
    else if (!str_cmp(arg1,"ahroun"))
	{improve = AUSPICE_AHROUN;gtype = 1;}
    else if (!str_cmp(arg1,"black furies"))
	{improve = TRIBE_BLACK_FURIES;gtype = 2;}
    else if (!str_cmp(arg1,"bone gnawers"))
	{improve = TRIBE_BONE_GNAWERS;gtype = 2;}
    else if (!str_cmp(arg1,"children of gaia"))
	{improve = TRIBE_CHILDREN_OF_GAIA;gtype = 2;}
    else if (!str_cmp(arg1,"child of spiral"))
	{improve = TRIBE_CHILD_OF_SPIRAL;gtype = 2;}
    else if (!str_cmp(arg1,"fianna"))
	{improve = TRIBE_FIANNA;gtype = 2;}
    else if (!str_cmp(arg1,"get of fenris"))
	{improve = TRIBE_GET_OF_FENRIS;gtype = 2;}
    else if (!str_cmp(arg1,"get of fenris"))
	{improve = TRIBE_GET_OF_FENRIS;gtype = 2;}
    else if (!str_cmp(arg1,"glass walkers"))
	{improve = TRIBE_GLASS_WALKERS;gtype = 2;}
    else if (!str_cmp(arg1,"red talons"))
	{improve = TRIBE_RED_TALONS;gtype = 2;}
    else if (!str_cmp(arg1,"shadow lords"))
	{improve = TRIBE_SHADOW_LORDS;gtype = 2;}
    else if (!str_cmp(arg1,"silent striders"))
	{improve = TRIBE_SILENT_STRIDERS;gtype = 2;}
    else if (!str_cmp(arg1,"silver fangs"))
	{improve = TRIBE_SILVER_FANGS;gtype = 2;}
    else if (!str_cmp(arg1,"stargazers"))
	{improve = TRIBE_STARGAZERS;gtype = 2;}
    else if (!str_cmp(arg1,"uktena"))
	{improve = TRIBE_UKTENA;gtype = 2;}
    else if (!str_cmp(arg1,"wendigos"))
	{improve = TRIBE_WENDIGO;gtype = 2;}
    else
    {
	send_to_char("They know of no such gift.\n\r",ch);
	return;
    }

	if (count_gifts(ch))
	{
		send_to_char("You cannot have anymore gifts.\n\r",ch);
		return;
	}

    switch (gtype)
    {
	default:
	    if (ch->pcdata->breed[improve] != 0)
	    {
		send_to_char("You already know that gift.\n\r",ch);
		return;
	    }
	    ch->pcdata->breed[improve] = -1;
	    break;
	case 1:
	    if (ch->pcdata->auspice[improve] != 0)
	    {
		send_to_char("You already know that gift.\n\r",ch);
		return;
	    }
	    ch->pcdata->auspice[improve] = -1;
	    break;
	case 2:
	    if (ch->pcdata->tribes[improve] != 0)
	    {
		send_to_char("You already know that gift.\n\r",ch);
		return;
	    }
	    ch->pcdata->tribes[improve] = -1;
	    break;
    }

    sprintf(buf,"%s teaches you how to use the %s gift.",teacher->short_descr->str,capitalize(arg1));
    send_to_char(buf,ch);
    sprintf(buf,"%s teaches %s the %s gift.",teacher->name->str,ch->name->str,capitalize(arg1));
	log_string2(buf);
    return;
}
void do_unmist(CHAR_DATA *ch, char *argument )
{

	if (!IS_AFFECTED(ch, AFF_POLYMORPH))
	{
		send_to_char( "You are already in human form.\n\r", ch );
		return;
	}
	
	if ( ch->mana < 500 )
	{
		send_to_char("You don't have enough mana!\n\r",ch);
		return;
	}
	
	if (IS_VAMPAFF(ch, VAM_CHANGED) && IS_SET(ch->pcdata->powers[WOLF_POLYAFF], POLY_MIST))
	{
		REMOVE_BIT(ch->pcdata->powers[WOLF_POLYAFF], POLY_MIST);
	}
	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,"");
	ch->mana -= 200;
	ch->paradox[0] += gain_paradox(ch);	
		return;
}

void do_tap_caern( CHAR_DATA *ch, char *argument)
{
	if (!IS_CLASS(ch,CLASS_MAGE))
	{
		send_to_char("huh?\n\r",ch);
		return;
	}

	if (ch->in_room->vnum != ROOM_VNUM_CAERN)
	{
		send_to_char("You not in a caern! go find one!\n\r",ch);
		return;
	}
	SET_BIT(ch->act,ACT_TAPPING);
	send_to_char("You dance around the room and chat incantations.\n\r",ch);
	act("$n starts to dance around the room, chanting incatations.",ch,NULL,NULL,TO_ROOM);
}

void do_scry( CHAR_DATA *ch, char *argument )
{
	CHAR_DATA *victim;
	ROOM_INDEX_DATA *chroom;
	ROOM_INDEX_DATA *victimroom;
	char      arg [MAX_INPUT_LENGTH];
	
	argument = one_argument( argument, arg );
	
	if (IS_NPC(ch)) return;
	
	if (!IS_ITEMAFF(ch, ITEMA_VISION))
	{
		send_to_char( "Huh?\n\r", ch );
		return;
	}
	
	if ( arg[0] == '\0' )
	{
		send_to_char( "Scry on whom?\n\r", ch );
		return;
	}
	
	if ( ( victim = get_char_world( ch, arg ) ) == NULL )
	{
		send_to_char( "They aren't here.\n\r", ch );
		return;
	}
	
	if (!knows_char(ch,victim))
	{
		send_to_char( "They aren't here.\n\r", ch );
		return;
	}	
	
	if (!IS_NPC(victim) && IS_IMMUNE(victim,IMM_SHIELDED) && !IS_ITEMAFF(ch, ITEMA_VISION))
	{
		send_to_char("You are unable to locate them.\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 locate them.\n\r",ch);
		return;
	}
	chroom = ch->in_room;
	victimroom = victim->in_room;
	
	char_from_room(ch);
	char_to_room(ch,victimroom);
	do_look(ch,"auto");
	char_from_room(ch);
	char_to_room(ch,chroom);
	
	return;
}

void do_readaura( CHAR_DATA *ch, char *argument )
{
	CHAR_DATA *victim;
	OBJ_DATA  *obj;
	char      arg [MAX_INPUT_LENGTH];
	char      buf [MAX_INPUT_LENGTH];
	char      buf2 [MAX_INPUT_LENGTH];
	sh_int    count;
	
	argument = one_argument( argument, arg );
	
	if (IS_NPC(ch)) return;
	
	if (!IS_ITEMAFF(ch, ITEMA_VISION))
	{
		send_to_char( "Huh?\n\r", ch );
		return;
	}
	
	if ( arg[0] == '\0' )
	{
		send_to_char( "Read the aura on what?\n\r", ch );
		return;
	}
	
	if ( ( victim = get_char_room( ch, arg ) ) == NULL )
	{
		if ( ( obj = get_obj_carry( ch, arg ) ) == NULL )
		{
			send_to_char( "Read the aura on what?\n\r", ch );
			return;
		}
		act("$n examines $p intently.",ch,obj,NULL,TO_ROOM);
		spell_identify( skill_lookup( "identify" ), ch->level, ch, obj );
		return;
	}
	
	if (check_disc(ch,victim,CDISC_PLANE))
		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;
	}
	
	act("$n examines $N intently.",ch,NULL,victim,TO_NOTVICT);
	act("$n examines you intently.",ch,NULL,victim,TO_VICT);
	if (IS_NPC(victim)) sprintf(buf, "%s is an NPC.\n\r",victim->short_descr->str);
	else 
	{
		if      (victim->level == 12) sprintf(buf, "%s is an Implementor.\n\r", victim->name->str);
		else if (victim->level == 11) sprintf(buf, "%s is a High Judge.\n\r", victim->name->str);
		else if (victim->level == 10) sprintf(buf, "%s is a Judge.\n\r", victim->name->str);
		else if (victim->level == 9 ) sprintf(buf, "%s is an Enforcer.\n\r", victim->name->str);
		else if (victim->level == 8 ) sprintf(buf, "%s is a Quest Maker.\n\r", victim->name->str);
		else if (victim->level == 7 ) sprintf(buf, "%s is a Builder.\n\r", victim->name->str);
		else if (victim->level >= 3 ) sprintf(buf, "%s is an Avatar.\n\r", victim->name->str);
		else sprintf(buf, "%s is a Mortal.\n\r", PERS(victim,ch));
	}
	send_to_char(buf,ch);
	if (!IS_NPC(victim))
	{
		sprintf(buf,"Str:%d, Int:%d, Wis:%d, Dex:%d, Con:%d.\n\r",get_curr_str(victim),get_curr_int(victim),get_curr_wis(victim),get_curr_dex(victim),get_curr_con(victim));
		send_to_char(buf,ch);
	}
	sprintf(buf,"Hp:%d/%d, Mana:%d/%d, Move:%d/%d.\n\r",victim->hit,victim->max_hit,victim->mana,victim->max_mana,victim->move,victim->max_move);
	send_to_char(buf,ch);
	if (!IS_NPC(victim)) sprintf(buf,"Hitroll:%d, Damroll:%d, AC:%d.\n\r",char_hitroll(victim),char_damroll(victim),char_ac(victim));
	else sprintf(buf,"AC:%d.\n\r",char_ac(victim));
	send_to_char(buf,ch);
	if (!IS_NPC(victim))
	{
		sprintf(buf,"Status:%d, ",victim->race);
		send_to_char(buf,ch);
		if (IS_CLASS(victim, CLASS_VAMPIRE))    
		{
			sprintf(buf,"Blood:%d, ",victim->pcdata->condition[COND_THIRST]);
			send_to_char(buf,ch);
		}
	}
	sprintf(buf,"Alignment:%d.\n\r",victim->alignment);
	send_to_char(buf,ch);
	if (!IS_NPC(victim) && IS_EXTRA(victim, EXTRA_PREGNANT))
		act("$N is pregnant.",ch,NULL,victim,TO_CHAR);
	if (!IS_NPC(victim) && IS_CLASS(victim, CLASS_VAMPIRE))    
	{
		send_to_char("Disciplines:",ch);
		for ( count = 0 ; count < MAX_DISCIPLINE ; count++ )
		{
			if ( get_disc(victim,count) > 0 )
			{
				sprintf(buf2, " %s %d ", discipline_table[count].name, get_disc(victim,count));
				strcat(buf, buf2);
			}
		}
		/*buf[strlen(buf)] = '.';  hack off the final comma, replace it with a period. */
		send_to_char(buf,ch);
		send_to_char("\n\r",ch);
	}
	return;
}

void do_focistat(CHAR_DATA *ch, char *argument)
{
	char  buf[MAX_STRING_LENGTH];
	OBJ_DATA *obj;
	int count;
	
	if ( ( obj = get_obj_wear( ch, "foci" ) ) == NULL )
	{
		send_to_char("You need to be holding your Foci to stat it.\n\r",ch);	
		return;
	}	
	
	send_to_char("Current Spheres on this Foci:\n\r",ch);
	send_to_char("     Sphere:        Level:\n\r",ch);
	for ( count = 0 ; count <= 8 ; count++ )
	{
		if ( obj->sphere[count] > 0 )
		{
			sprintf(buf," %18s %3d\n\r", mage_sphere_table[count].sphere_name, obj->sphere[count]);
			send_to_char(buf,ch);	
		}	
	}	
}

void do_learndisc(CHAR_DATA *ch, char *argument)
{
    char arg[MSL];
    char arg2[MSL];
    int count, discipline;
    char buf[MSL];
    int clancount = 0, clanmax = 10;
    
    CHAR_DATA *victim;
        
    argument = one_argument(argument,arg);
    argument = one_argument(argument,arg2);

    if (arg[0] == '\0')
    {
        send_to_char("Who do you want to teach?\n\r",ch);
        return;
    }
    
    if (arg2[0] == '\0') 
    {
        send_to_char("What do you want to teach them?\n\r",ch);
        return;
    }

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

    if (!IS_CLASS(victim,CLASS_VAMPIRE) && !IS_IMMORTAL(victim))
    {
        send_to_char("There not a vampire.. yea right.\n\r",ch);
        return;
    }


    if (IS_IMMUNE(victim,IMM_VAMPIRE))
    {
        send_to_char("They are unwilling to learn.\n\r",ch);
        return;
    }

    if ((discipline = discipline_lookup(arg2)) == -1)
    {
        send_to_char("No discipline by that name.\n\r",ch);
        return;
    }
    
    if (victim->pcdata->stats[UNI_CURRENT] == -1)
    {
        for ( count = 0 ; count < MAX_DISC ; count++ )
        {
            if ( get_disc(victim,count) > 0 )
                victim->pcdata->Ninherited[count] = 1;
        }
    }

    if (victim->pcdata->stats[UNI_GEN] >= 2)
    {
        clanmax = 12;
    }
    if (victim->pcdata->stats[UNI_GEN] >= 4)
    {
        clanmax = UMAX( 3, ( 14 -  victim->pcdata->stats[UNI_GEN] ) );
    }
    if (victim->pcdata->stats[UNI_GEN] >= 5) clanmax += 1;

    //	if (ch->pcdata->stats[UNI_GEN] >= 6) ratemax = 5;
    //	if (ch->pcdata->stats[UNI_GEN] >= 8) ratemax = 4;

    if (victim->pcdata->rank == AGE_ANCILLA     ) clanmax += 1;
    if (victim->pcdata->rank == AGE_ELDER       ) clanmax += 2;
    if (victim->pcdata->rank == AGE_METHUSELAH  )
    {
        clanmax += 3;
        //extra Disc for those Meth Vamps
    }

    for ( count = 0 ; count < MAX_DISC; count++ )
    {
        if ( get_disc(victim,count) > 0 || IS_VAMPPASS(victim,count) )
            clancount++;
    }

    if (clancount >= clanmax)
    {
        send_to_char("You can learn no more disciplines.\n\r",ch);
        return;
    }

    if (ch->pcdata->Ninherited[discipline] != 1)
    {
        send_to_char("That is not your clan discipline. They cannot teach you that one.\n\r",ch);
        return;
    }

    if (ch->pcdata->disc[discipline] < 3)
    {
        send_to_char("You have not gotten above 3 in your discipline, you can learn nothing from them.\n\r",ch);
        return;
    }

    if (victim->practice < 100)
    {
        send_to_char("Then don't have the requiered primal.\n\r",ch);
        return;
    }
    
    sprintf(buf,"You learn the ways of %s.\n\r",discipline_table[discipline].name);
    send_to_char(buf,victim);
    
    sprintf(buf,"$N learns the ways of %s from you.\n\r",discipline_table[discipline].name);
    act(buf,victim,NULL,ch,TO_VICT);

    //*FIXME*
    victim->pcdata->disc[discipline]++;
    victim->practice -= 100;
    victim->pcdata->spent[SPENT_P] += 100;
	sprintf(buf,"%s teaches %s the %s discipline.",ch->name->str,victim->name->str,discipline_table[discipline].name);
	log_string2(buf);
	return;

}

void do_sidestep( CHAR_DATA *ch, char *argument )
{
	if (!IS_SWWF(ch))
	{
		send_to_char("Your not Garou.. shoo!\n\r",ch);
		return;
	}
	if (ch->fighting != NULL)
	{
		send_to_char("Not while fighting.\n\r",ch);
		return;
	}
	if (ch->plane == PLANE_NORMAL){
		ch->plane = PLANE_UMBRA;
		shift_obj_plane(ch);
		send_to_char("You sidestep in to the umbra.\n\r",ch);
	} 
	else if (ch->plane == PLANE_UMBRA){
		ch->plane = PLANE_NORMAL;
		shift_obj_plane(ch);
		send_to_char("You sidestep back in to the normal plane.\n\r",ch);
	}
	else{
		send_to_char("Not on this plane.\n\r",ch);
		return;
	}

	do_look(ch,"auto");
	return;
}
int count_discs( CHAR_DATA *ch ){
    int count,clancount = 0;

    if (ch->pcdata->stats[UNI_CURRENT] == -1)
    {
        for ( count = 0 ; count < MAX_DISC ; count++ )
        {
            if ( get_disc(ch,count) > 0 )
                ch->pcdata->Ninherited[count] = 1;
        }
    }

    for ( count = 0 ; count < MAX_DISC; count++ )
    {
        if ( get_disc(ch,count) > 0)
            clancount++;
    }
    return clancount;

}

int clan_max( CHAR_DATA *ch ){
    int clanmax = 0;

    if (ch->pcdata->stats[UNI_GEN] >= 2)
    {
        clanmax = 12;
    }
    if (ch->pcdata->stats[UNI_GEN] >= 4)
    {
        clanmax = UMAX( 3, ( 14 -  ch->pcdata->stats[UNI_GEN] ) );
    }
    if (ch->pcdata->stats[UNI_GEN] >= 5) clanmax += 1;

    //	if (ch->pcdata->stats[UNI_GEN] >= 6) ratemax = 5;
    //	if (ch->pcdata->stats[UNI_GEN] >= 8) ratemax = 4;

    if (ch->pcdata->rank == AGE_ANCILLA     ) clanmax += 1;
    if (ch->pcdata->rank == AGE_ELDER       ) clanmax += 2;
    if (ch->pcdata->rank == AGE_METHUSELAH  )
    {
        clanmax += 3;
        //extra Disc for those Meth Vamps
    }
    return clanmax;

}

void do_gain_disc( CHAR_DATA *ch, char *argument)
{
	CHAR_DATA *teacher;
	bool tFound = FALSE;
	char arg1[MAX_STRING_LENGTH];
	char buf[MAX_STRING_LENGTH];
	int improve;
	DESCRIPTOR_DATA *d;
	CHAR_DATA *wch;
	GSList *desc_list = descriptor_list;
	
        smash_tilde(argument);
	one_argument(argument,arg1);
	
	if (!IS_VAMPIRE(ch) )
    	{
		send_to_char("Huh?\n\r",ch);
		return;
    	}
	
	for (teacher = ch->in_room->people; teacher != NULL; teacher = teacher->next_in_room)
	{
		if (IS_NPC(teacher) && IS_SET(teacher->mob_con, MOBCON_TEACHER))
			tFound = TRUE;
	}
	
	
	if (tFound == FALSE)
	{
		send_to_char("You don't see a teacher here.\n\r",ch);
		return;
	}


    if ( arg1[0] == '\0' )
    {
	send_to_char( "Syntax: gaindisc <discipline>\n\r", ch );
	send_to_char( "Cost of Learning: 10 Roleplaying Points\n\r", ch);
	return;
    }

    while ( desc_list != NULL )
    {
    	d = (DESCRIPTOR_DATA*)desc_list->data;
	    wch = d->character;
	    if (IS_VAMPIRE(wch) && wch != ch)
	    {
	    	do_say(teacher,"There are others that you can learn from, leave me be.");
		    return;
	    }
	    desc_list = g_slist_next(desc_list);	
    }
	g_slist_free(desc_list);

    if (!str_cmp(arg1,"potence"))
	{improve = DISC_POTENCE;}
    else if (!str_cmp(arg1,"fortitude"))
	{improve = DISC_FORTITUDE;}
    else if (!str_cmp(arg1,"celerity"))
	{improve = DISC_CELERITY;}
    else if (!str_cmp(arg1,"protean"))
	{improve = DISC_PROTEAN;}
    else
    {
	send_to_char("They know of no such discipline.\n\r",ch);
	return;
    }

	if (count_discs(ch) >= clan_max(ch))
	{
		send_to_char("You cannot have anymore disciplines.\n\r",ch);
		return;
	}
	
    sprintf(buf,"%s teaches you how to use the %s discipline.",teacher->short_descr->str,capitalize(arg1));
    send_to_char(buf,ch);
    ch->pcdata->disc[improve]++;
    ch->practice -= 100;
    ch->pcdata->spent[SPENT_P] += 100;
return;
}