/************************************************************
 *                                                          *
 * Code by Sebeq for Eternal Darkness                       *
 * (C)June 2003                                             * 
 * If you use this code please email me at                  *
 * Acadian_lord@hotmail.com incase you have some questions  *
 * or you run across some bugs so i can modify the code.    *
 ************************************************************/

#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 "dragon.h"


void do_drakform( CHAR_DATA *ch, char *argument)
{
	 char buf [MAX_STRING_LENGTH];
	 char AGE_STRING [MAX_STRING_LENGTH];

	 if (IS_NPC(ch)) return;
	 if( !IS_CLASS(ch, CLASS_DRAGON))
	 {
		send_to_char( "Huh?\n\r",ch);
		return;
	 }
	 if (IS_POLYAFF(ch, POLY_DRAGON))
	 {
		  REMOVE_BIT(ch->polyaff, POLY_DRAGON);
		  REMOVE_BIT(ch->affected_by, AFF_POLYMORPH);
		  act( "You transform into human form.", ch, NULL, NULL, TO_CHAR );
		  act( "$n's shrinks back into human form.", ch, NULL, NULL, TO_ROOM );
		  ch->max_hit = (ch->max_hit - (ch->pcdata->powers[dragonage] * 250));
		  ch->hit = (ch->hit - (ch->pcdata->powers[dragonage] * 250));
		  if (ch->hit < 1) ch->hit = 1;
                  ch->pcdata->powers[10] = ch->pcdata->powers[DRAGON_COLOR];
		  ch->damroll -= ch->pcdata->powers[dragonage] * 500;
		  ch->hitroll -= ch->pcdata->powers[dragonage] * 500;
		  ch->armor   += ch->pcdata->powers[dragonage] * 750;
                  free_string( ch->morph );
		  ch->morph = str_dup( "" );
		  return;
	 }
	 else if (IS_AFFECTED(ch,AFF_POLYMORPH))
	 {
		send_to_char("You cant demon form when changed.\n\r",ch);
    	return;
	 }
	      if (ch->pcdata->powers[dragonage] == 1  ) sprintf(AGE_STRING,"Hatchling");
	 else if (ch->pcdata->powers[dragonage] == 2  ) sprintf(AGE_STRING,"Very Young");
	 else if (ch->pcdata->powers[dragonage] == 3  ) sprintf(AGE_STRING,"Young");
	 else if (ch->pcdata->powers[dragonage] == 4  ) sprintf(AGE_STRING,"Juvenile");
	 else if (ch->pcdata->powers[dragonage] == 5  ) sprintf(AGE_STRING,"Young Adult");
	 else if (ch->pcdata->powers[dragonage] == 6  ) sprintf(AGE_STRING,"Adult");
	 else if (ch->pcdata->powers[dragonage] == 7  ) sprintf(AGE_STRING,"Mature Adult");
	 else if (ch->pcdata->powers[dragonage] == 8  ) sprintf(AGE_STRING,"Old");
	 else if (ch->pcdata->powers[dragonage] == 9  ) sprintf(AGE_STRING,"Very Old");
	 else if (ch->pcdata->powers[dragonage] == 10 ) sprintf(AGE_STRING,"Elder");
	 else if (ch->pcdata->powers[dragonage] == 11 ) sprintf(AGE_STRING,"Venerable");
	 else if (ch->pcdata->powers[dragonage] == 12 ) sprintf(AGE_STRING,"Ancient");
         else if (ch->pcdata->powers[dragonage] == 13 ) sprintf(AGE_STRING,"Immortal");
	 else return;

	switch(ch->pcdata->powers[DRAGON_COLOR])
	 {
                case 0: 
			if (ch->pcdata->powers[10] == 0) 
			{
                           send_to_char("your character is bugged, please report this to imm.\n\r",ch);
                        }

                        break;
                case 1:
			sprintf(buf, "%s the %s #rRed#n Dragon", ch->name,AGE_STRING);
			free_string( ch->morph );
			ch->morph = str_dup( buf );
			break;
		case 2:
			sprintf(buf, "%s the %s #gGreen#n Dragon", ch->name,AGE_STRING);
			free_string( ch->morph );
			ch->morph = str_dup( buf );
			break;
		case 3:
			sprintf(buf, "%s the %s #lBlue#n Dragon", ch->name,AGE_STRING);
			free_string( ch->morph );
			ch->morph = str_dup( buf );
			break;
		case 4:
			sprintf(buf, "%s the %s #oBronze#n Dragon", ch->name,AGE_STRING);
			free_string( ch->morph );
			ch->morph = str_dup( buf );
			break;
		case 5:
			sprintf(buf, "%s the %s #cSilver#n Dragon", ch->name,AGE_STRING);
			free_string( ch->morph );
			ch->morph = str_dup( buf );
			break;
		case 6:
			sprintf(buf, "%s the %s #wWhite#n Dragon", ch->name,AGE_STRING);
			free_string( ch->morph );
			ch->morph = str_dup( buf );
			break;
		case 7:
			sprintf(buf, "%s the %s #0Black#n Dragon", ch->name,AGE_STRING);
			free_string( ch->morph );
			ch->morph = str_dup( buf );
			break;
		case 8:
			sprintf(buf, "%s the %s #yGold#n Dragon", ch->name,AGE_STRING);
			free_string( ch->morph );
			ch->morph = str_dup( buf );
			break;
		case 9:
			sprintf(buf, "%s the %s #0S#wh#0a#wd#0o#ww#n Dragon", ch->name,AGE_STRING);
			free_string( ch->morph );
			ch->morph = str_dup( buf );
			break;
		case 10:
			sprintf(buf, "%s the %s #pP#Pur#ppl#Pe#n Dragon", ch->name,AGE_STRING);
			free_string( ch->morph );
			ch->morph = str_dup( buf );
			break;
		case 11:
			sprintf(buf, "%s the %s #rC#eh#ra#eo#rs#n Dragon", ch->name,AGE_STRING);
			free_string( ch->morph );
			ch->morph = str_dup( buf );
			break;
		case 12:
			sprintf(buf, "%s the %s #LS#la#Lp#lp#Lh#li#Lr#le#n Dragon", ch->name,AGE_STRING);
			free_string( ch->morph );
			ch->morph = str_dup( buf );
			break;
		case 13:
			sprintf(buf, "%s the %s #GE#gm#Ge#gr#Ga#gl#Gd#n Dragon", ch->name,AGE_STRING);
			free_string( ch->morph );
			ch->morph = str_dup( buf );
			break;
		case 14:
			sprintf(buf, "%s the %s #RR#ru#Rb#ry#n Dragon", ch->name,AGE_STRING);
			free_string( ch->morph );
			ch->morph = str_dup( buf );
			break;
		case 15:
			sprintf(buf, "%s the %s #yT#oo#yp#oa#yz#n Dragon", ch->name,AGE_STRING);
			free_string( ch->morph );
			ch->morph = str_dup( buf );
			break;
                default: 
                        sprintf(buf, "%s the %s invalid color Dragon", ch->name,AGE_STRING);
                        free_string( ch->morph );
                        ch->morph = str_dup( buf );
                        break;
	 }

	 act( "You transform into a huge dragon.", ch, NULL, NULL, TO_CHAR );
	 act( "$n's body grows and distorts into a huge dragon.", ch, NULL, NULL, TO_ROOM );
	 ch->pcdata->mod_str = 15;
	 ch->pcdata->mod_dex = 15;
	 SET_BIT(ch->polyaff, POLY_DRAGON);
	 SET_BIT(ch->affected_by, AFF_POLYMORPH);

	 ch->max_hit += ch->pcdata->powers[dragonage] * 250;
	 ch->hit     += ch->pcdata->powers[dragonage] * 250;
	 ch->damroll += ch->pcdata->powers[dragonage] * 500;
	 ch->hitroll += ch->pcdata->powers[dragonage] * 500;
	 ch->armor   -= ch->pcdata->powers[dragonage] * 750;
	 return;
}


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

	 argument = one_argument( argument, arg );

	if (IS_NPC(ch)) return;

	if( !IS_IMMORTAL(ch) )
	{
		if( !IS_CLASS(ch, CLASS_DRAGON ) )
		{
			send_to_char( "Huh?\n\r", ch);
			return;
		}
		if( ch->pcdata->powers[dragonage] < D_ADULT)
		{
			send_to_char( "You must be an adult to create hatchlings.\n\r", ch );
			return;
		}
		if( ch->pcdata->powers[hatch] >= 5)
		{
			send_to_char( "You have already created 5 hatchlings.\n\r", ch );
			return;
		}
		if (!IS_CLASS(ch, CLASS_DRAGON))
		{
			send_to_char( "Huh?\n\r",ch);
			return;
		}
	}

    if ( arg[0] == '\0' )
    {
    send_to_char( "Hatch 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 ( ch == victim )
	 {
    send_to_char( "You cannot hatch yourself.\n\r", ch );
	 return;
	 }
	 if ( victim->level != LEVEL_AVATAR && !IS_IMMORTAL(victim) )
    {
    send_to_char( "You can only hatch a dragon from avatars.\n\r", ch );
    return;
	 }

	if( IS_CLASS( victim, CLASS_DEMON ) )
	{
		send_to_char( "You can't hatch a dragon from a Demon.\n\r", ch );
		return;
	}
	if( IS_CLASS( victim, CLASS_MAGE ) )
	{
		send_to_char( "You can't hatch a dragon from a Mage.\n\r", ch );
		return;
	}
	if( IS_CLASS( victim, CLASS_WEREWOLF ) )
	{
		send_to_char( "You can't hatch a dragon from a Werewolf.\n\r", ch );
		return;
	}
	if( IS_CLASS( victim, CLASS_VAMPIRE ) )
	{
		send_to_char( "You can't hatch a dragon from a Vampire.\n\r", ch );
		return;
	}
	if( IS_CLASS( victim, CLASS_DROW ) )
	{
		send_to_char( "You can't hatch a dragon from a Drow.\n\r", ch );
		return;
	}
	if( IS_CLASS( victim, CLASS_NINJA ) )
	{
		send_to_char( "You can't hatch a dragon from a Ninja.\n\r", ch );
		return;
	}
	if( IS_CLASS( victim, CLASS_MONK ) )
	{
		send_to_char( "You can't hatch a dragon from a Monk.\n\r", ch );
		return;
	}

        if (ch->exp < 50000000 || ch->pcdata->stats[DEMON_CURRENT] < 5000000)
        {
          send_to_char("You need 50000000 exp and 5000000 dps to hatch a dragon.\n\r",ch);
          return;
        }
        if (victim->exp < 5000000)
        {
          send_to_char("You need 5000000 exp to be hatched.\n\r",victim);
          send_to_char("They need 5000000 exp to be hatched.\n\r",ch);
          return;
        }
       
	 act("You consume $N's essence and hatch a new egg!", ch, NULL, victim, TO_CHAR);
	 act("$n consumes $N's essence and hatch a new egg!", ch, NULL, victim, TO_NOTVICT);
	 act("$n consumes your essence and makes you a dragon!", ch, NULL, victim, TO_VICT);

	 victim->class=0;
	 victim->class=CLASS_DRAGON;
	 victim->pcdata->powers[dragonage] = 1;
	 victim->pcdata->powers[DRAGON_COLOR] = ch->pcdata->powers[DRAGON_COLOR];
	 if ( ch->pcdata->powers[DRAGON_COLOR] == 0 ) 
           victim->pcdata->powers[DRAGON_COLOR] = number_range (1, 15);
	 victim->special=0;
	 victim->level = LEVEL_AVATAR;
	 victim->class = CLASS_DRAGON;
	 ch->pcdata->powers[hatch] += 1;
         ch->pcdata->stats[DEMON_CURRENT] -= 5000000;
         ch->exp -= 50000000;
         victim->exp -= 5000000;
	 save_char_obj(ch);
	 save_char_obj(victim);
	 return;
}

void do_dgain( CHAR_DATA *ch, char *argument )
{
	char arg[MAX_INPUT_LENGTH];
	char buf[MAX_INPUT_LENGTH];
	int count = 1;

	 argument = one_argument( argument, arg );

	  if (!IS_CLASS(ch, CLASS_DRAGON))
	  {
       stc("You're not a dragon!\n\r",ch);
       return;
	  }

	if(IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_WINGS )) count += 1;
	if(IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_FANGS )) count += 1;
	if(IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_LICK )) count += 1;
	if(IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_FROST_BREATH )) count += 1;
	if(IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_FIRE_BREATH )) count += 1;
	if(IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_LIGHTNING_BREATH )) count += 1;
	if(IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_ACID_BREATH )) count += 1;
	if(IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_GAS_BREATH )) count += 1;
	if(IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_TAIL )) count += 1;
	if(IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_TERROR )) count += 1;
	if(IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_CONFUSE )) count += 1;
	if(IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_MASK )) count += 1;
	if(IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_MAGIC )) count += 1;
	if(IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_POLYMORPH )) count += 1;
	if(IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_LUCK )) count += 1;
	if(IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_FLY )) count += 1;
	if(IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_SCRY )) count += 1;
	if(IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_PEER )) count += 1;
	if(IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_TRUESIGHT )) count += 1;
	if(IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_TOUGHNESS)) count += 1;
	if(IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_CLAWS)) count += 1;

	if( IS_NPC(ch) ) return;

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

	if( arg[0] == '\0' )
	{
		int x = 0;
		send_to_char( "Valid choices are:  ALL(shows skills learned)\n\r", ch );
		if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_WINGS ) && ch->pcdata->powers[dragonage] >= D_ADULT)
		{
			send_to_char( "Wings,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_SCRY ) )
		{
			send_to_char( " Scry,", ch );
			x++;
			if( x > 5){send_to_char("\n\r", ch);x = 0;}
		}
		if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_CLAWS ) )
		{
			send_to_char( " Claws,", ch );
			x++;
			if( x > 5){send_to_char("\n\r", ch);x = 0;}
		}
		if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_TRUESIGHT ) )
		{
			send_to_char(" Truesight,", ch );
			x++;
			if(x>5){send_to_char("\n\r", ch);x=0;}
		}
		if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_PEER ) )
		{
			send_to_char( " Peer,", ch );
			x++;
			if(x > 5){send_to_char("\n\r", ch);x=0;}
		}
		if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_FANGS ) )
		{
			send_to_char( " Fangs,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_LICK ) )
		{
			send_to_char( " Lick,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_FROST_BREATH ) && ch->pcdata->powers[dragonage] >= D_MATURE)
		{
			send_to_char( " FrostBreath,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_FIRE_BREATH ) && ch->pcdata->powers[dragonage] >= D_JUVENILE)
		{
			send_to_char( " FireBreath,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_LIGHTNING_BREATH ) && ch->pcdata->powers[dragonage] >= D_YADULT )
		{
			send_to_char( " LightningBreath,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_ACID_BREATH ) && ch->pcdata->powers[dragonage] >= D_VENERABLE )
		{
			send_to_char( " AcidBreath,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_GAS_BREATH ) )
		{
			send_to_char( " GasBreath,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_TAIL ) && ch->pcdata->powers[dragonage] >= D_YOUNG )
		{
			send_to_char( " Tail,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_TERROR ) )
		{
			send_to_char( " Terror,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_CONFUSE ) )
		{
			send_to_char( " Confuse,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_MASK ) && ch->pcdata->powers[dragonage] >= D_OLD )
		{
			send_to_char( " Mask,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_MAGIC ) )
		{
			send_to_char( " Magic,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_POLYMORPH ) && ch->pcdata->powers[dragonage] >= D_IMMORTAL )
		{
			send_to_char( " Polymorph,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_LUCK ) && ch->pcdata->powers[dragonage] >= D_ADULT )
		{
			send_to_char( " Luck,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_FLY	) && ch->pcdata->powers[dragonage] >= D_ADULT )
		{
			send_to_char( " Fly,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_TOUGHNESS) && ch->pcdata->powers[dragonage] >= D_ANCIENT)
		{
			send_to_char( " Scales,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		send_to_char( "\n\r", ch );
		send_to_char( "Some are only avaiable after a certain age. Check helps for ages.\n\r", ch );
		return;
	}
	else if( !str_cmp( arg, "all"	) )
	{
		int x = 0;
		send_to_char( "You have the folowing dragon powers:\n\r", ch );
		if(IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_WINGS ))
		{
			send_to_char( "Wings,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		if( IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_CLAWS	) )
		{
			send_to_char( " Claws,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}

		if( IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_FLY	) )
		{
			send_to_char( " Fly,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		if( IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_TRUESIGHT ) )
		{
			send_to_char(" Truesight,", ch );
			x++;
			if(x>5){send_to_char("\n\r", ch);x=0;}
		}
		if( IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_PEER ) )
		{
			send_to_char( " Peer,", ch );
			x++;
			if(x > 5){send_to_char("\n\r", ch);x=0;}
		}
		if(IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_FANGS ))
		{
			send_to_char( " Fangs,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		if( IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_SCRY ) )
		{
			send_to_char( " Scry,", ch );
			x++;
			if( x > 5){send_to_char("\n\r", ch);x = 0;}
		}
		if(IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_LICK ))
		{
			send_to_char( " Lick,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		if(IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_FROST_BREATH ))
		{
			send_to_char( " FrostBreath,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		if(IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_FIRE_BREATH )) 
		{
			send_to_char( " FireBreath,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		if(IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_LIGHTNING_BREATH )) 
		{
			send_to_char( " LightningBreath,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		if(IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_ACID_BREATH )) 
		{
			send_to_char( " AcidBreath,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		if(IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_GAS_BREATH ))
		{
			send_to_char( " GasBreath,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		if(IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_TAIL ))
		{
			send_to_char( " Tail,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		if(IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_TERROR )) 
		{
			send_to_char( " Terror,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		if(IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_CONFUSE )) 
		{
			send_to_char( " Confuse,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		if(IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_MASK )) 
		{
			send_to_char( " Mask,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		if(IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_MAGIC ))
		{
			send_to_char( " Magic,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		if(IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_POLYMORPH ))
		{
			send_to_char( " Polymorph,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		if(IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_LUCK ))
		{
			send_to_char( " Luck,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_TOUGHNESS))
		{
			send_to_char( " Scales,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		send_to_char( "\n\r", ch );
		return;
	}
	else if( !str_cmp( arg, "wings" ) )
	{
		if( IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_WINGS ) )
		{
			send_to_char( "You already have your wings.\n\r", ch );
			return;
		}
		if( ch->pcdata->powers[dragonage] < D_ADULT )
		{
			send_to_char( "You must be an adult dragon to learn this power.\n\r", ch );
			return;
		}
		if( ch->pcdata->stats[DEMON_CURRENT] < (count * 1000) )
		{
								sprintf( buf, "You need %d exp.\n\r", (count * 1000) );
			return;
		}
		ch->exp -= (count * 1000);
		send_to_char( "You now have your wings.\n\r", ch );
		SET_BIT( ch->pcdata->powers[DPOWER_FLAGS], DRA_WINGS );
		return;
	}
	else if( !str_cmp( arg, "truesight" ) )
	{
		if( IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_TRUESIGHT ))
		{
			send_to_char( "You already have sight beyond sight.\n\r", ch );
			return;
		}
		if( ch->pcdata->stats[DEMON_CURRENT] < (count * 1000) )
		{
			sprintf( buf, "You need %d dragon points\n\r", (count * 1000) );
			return;
		}
		ch->pcdata->stats[DEMON_CURRENT] -= (count * 1000);
		send_to_char( "You now have sight beyond sight.\n\r", ch );
		SET_BIT( ch->pcdata->powers[DPOWER_FLAGS], DRA_TRUESIGHT );
		return;
	}
	else if( !str_cmp( arg, "fangs" ) )
	{
		if( IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_FANGS ))
		{
			send_to_char( "You already have your fangs.\n\r", ch );
			return;
		}
		if( ch->pcdata->stats[DEMON_CURRENT] < (count * 1000) )
		{
							  sprintf( buf, "You need %d dragon points\n\r", (count * 1000) );
			send_to_char( buf, ch );
			return;
		}
		ch->pcdata->stats[DEMON_CURRENT] -= (count * 1000);
		send_to_char( "You now have your fangs.\n\r", ch );
		SET_BIT( ch->pcdata->powers[DPOWER_FLAGS], DRA_FANGS );
		return;
	}
	else if( !str_cmp( arg, "claws" ) )
	{
		if( IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_CLAWS ))
		{
			send_to_char( "You already have your claws.\n\r", ch );
			return;
		}
		if( ch->pcdata->stats[DEMON_CURRENT] < (count * 1000) )
		{
							  sprintf( buf, "You need %d dragon points\n\r", (count * 1000) );
			send_to_char( buf, ch );
			return;
		}
		ch->pcdata->stats[DEMON_CURRENT] -= (count * 1000);
		send_to_char( "You now have your claws.\n\r", ch );
		SET_BIT( ch->pcdata->powers[DPOWER_FLAGS], DRA_CLAWS );
		return;
	}

	else if( !str_cmp( arg, "lick" ))
	{
		if( IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_LICK ))
		{
			send_to_char( "You already can can heal your wounds by licking 'em.\n\r", ch );
			return;
		}
		if( ch->pcdata->stats[DEMON_CURRENT] < (count * 1000) )
		{
							  sprintf( buf, "You need %d dragon points\n\r", (count * 1000) );
			send_to_char( buf, ch );
			return;
		}
		ch->pcdata->stats[DEMON_CURRENT] -= (count * 1000);
		send_to_char( "You now can heal your wounds by licking them.\n\r", ch );
		SET_BIT( ch->pcdata->powers[DPOWER_FLAGS], DRA_LICK );
		return;
	}
	else if( !str_cmp( arg, "frostbreath" ))
	{
		if( IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_FROST_BREATH ))
		{
			send_to_char( "You already can breath frost.\n\r", ch );
			return;
		}
		if( ch->pcdata->powers[dragonage] < D_MATURE )
		{
			send_to_char( "You must be a mautre adult dragon to learn this skill.\n\r", ch );
			return;
		}
		if( ch->pcdata->stats[DEMON_CURRENT] < (count * 1000) )
		{
							  sprintf( buf, "You need %d dragon points\n\r", (count * 1000) );
			send_to_char( buf, ch );
			return;
		}
		ch->pcdata->stats[DEMON_CURRENT] -= (count * 1000);
		send_to_char( "You now can breath frost.\n\r", ch );
		SET_BIT( ch->pcdata->powers[DPOWER_FLAGS], DRA_FROST_BREATH );
		return;
	}
	else if( !str_cmp( arg, "firebreath" ))
	{
		if( IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_FIRE_BREATH ))
		{
			send_to_char( "You already can breath fire.\n\r", ch );
			return;
		}
		if( ch->pcdata->powers[dragonage] < D_JUVENILE )
		{
			send_to_char( "You must be a juvenile dragon to learn this power.\n\r", ch );
			return;
		}
		if( ch->pcdata->stats[DEMON_CURRENT] < (count * 1000) )
		{
							  sprintf( buf, "You need %d dragon points\n\r", (count * 1000) );
			send_to_char( buf, ch );
			return;
		}
		ch->pcdata->stats[DEMON_CURRENT] -= (count * 1000);
		send_to_char( "You now can breath fire.\n\r", ch );
		SET_BIT( ch->pcdata->powers[DPOWER_FLAGS], DRA_FIRE_BREATH );
		return;
	}
	else if( !str_cmp( arg, "lightningbreath" ))
	{
		if( IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_LIGHTNING_BREATH ))
		{
			send_to_char( "You already can breath lightning.\n\r", ch );
			return;
		}
		if( ch->pcdata->powers[dragonage] < D_YADULT )
		{
			send_to_char( "You mus be a young dragon adult to learn this power.\n\r", ch );
			return;
		}
		if( ch->pcdata->stats[DEMON_CURRENT] < (count * 1000) )
		{
							  sprintf( buf, "You need %d dragon points\n\r", (count * 1000) );
			send_to_char( buf, ch );
			return;
		}
		ch->pcdata->stats[DEMON_CURRENT] -= (count * 1000);
		send_to_char( "You now can breath lightning.\n\r", ch );
		SET_BIT( ch->pcdata->powers[DPOWER_FLAGS], DRA_LIGHTNING_BREATH );
		return;
	}
	else if( !str_cmp( arg, "acidbreath" ))
	{
		if( IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_ACID_BREATH ))
		{
			send_to_char( "You already can breath acid.\n\r", ch );
			return;
		}
		if( ch->pcdata->powers[dragonage] < D_VENERABLE )
		{
			send_to_char( "You mus be a venerable dragon to learn this power.\n\r", ch );
			return;
		}
		if( ch->pcdata->stats[DEMON_CURRENT] < (count * 1000) )
		{
							  sprintf( buf, "You need %d dragon points\n\r", (count * 1000) );
			send_to_char( buf, ch );
			return;
		}
		ch->pcdata->stats[DEMON_CURRENT] -= (count * 1000);
		send_to_char( "You now can breath acid.\n\r", ch );
		SET_BIT( ch->pcdata->powers[DPOWER_FLAGS], DRA_ACID_BREATH );
		return;
	}
	else if( !str_cmp( arg, "gasbreath" ))
	{
		if( IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_GAS_BREATH ))
		{
			send_to_char( "You already can breath gas.\n\r", ch );
			return;
		}
		if( ch->pcdata->stats[DEMON_CURRENT] < (count * 1000) )
		{
							  sprintf( buf, "You need %d dragon points\n\r", (count * 1000) );
			send_to_char( buf, ch );
			return;
		}
		ch->pcdata->stats[DEMON_CURRENT] -= (count * 1000);
		send_to_char( "You now can breath gas.\n\r", ch );
		SET_BIT( ch->pcdata->powers[DPOWER_FLAGS], DRA_GAS_BREATH );
		return;
	}
	else if( !str_cmp( arg, "tail" ))
	{
		if( IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_TAIL ))
		{
			send_to_char( "You already can use your tail to attack.\n\r", ch );
			return;
		}
		if( ch->pcdata->powers[dragonage] < D_VYOUNG )
		{
			send_to_char( "You must be a very young dragon to learn this power.\n\r", ch );
			return;
		}
		if( ch->pcdata->stats[DEMON_CURRENT] < (count * 1000) )
		{
							  sprintf( buf, "You need %d dragon points\n\r", (count * 1000) );
			send_to_char( buf, ch );
			return;
		}
		ch->pcdata->stats[DEMON_CURRENT] -= (count * 1000);
		send_to_char( "You now can use your tail to attack.\n\r", ch );
		SET_BIT( ch->pcdata->powers[DPOWER_FLAGS], DRA_TAIL );
		return;
	}
	else if( !str_cmp( arg, "terror" ))
	{
		if( IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_TERROR ))
		{
			send_to_char( "You already inspire terror in mobs.\n\r", ch );
			return;
		}
		if( ch->pcdata->stats[DEMON_CURRENT] < (count * 1000) )
		{
							  sprintf( buf, "You need %d dragon points\n\r", (count * 1000) );
			send_to_char( buf, ch );
			return;
		}
		ch->pcdata->stats[DEMON_CURRENT] -= (count * 1000);
		send_to_char( "You now inspire terror in mobs.\n\r", ch );
		SET_BIT( ch->pcdata->powers[DPOWER_FLAGS], DRA_TERROR );
		return;
	}
	else if( !str_cmp( arg, "confuse" ))
	{
		if( IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_CONFUSE ))
		{
			send_to_char( "You already can confuse your targets.\n\r", ch );
			return;
		}
		if( ch->pcdata->stats[DEMON_CURRENT] < (count * 1000) )
		{
							  sprintf( buf, "You need %d dragon points\n\r", (count * 1000) );
			send_to_char( buf, ch );
			return;
		}
		ch->pcdata->stats[DEMON_CURRENT] -= (count * 1000);
		send_to_char( "You now can confuse your targets.\n\r", ch );
		SET_BIT( ch->pcdata->powers[DPOWER_FLAGS], DRA_CONFUSE );
		return;
	}
	else if( !str_cmp( arg, "mask" ))
	{
		if( IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_MASK ))
		{
			send_to_char( "You already can mask people.\n\r", ch );
			return;
		}
		if( ch->pcdata->powers[dragonage] < D_OLD )
		{
			send_to_char( "You must be an old dragon to learn this power.\n\r", ch );
			return;
		}
		if( ch->pcdata->stats[DEMON_CURRENT] < (count * 1000) )
		{
							  sprintf( buf, "You need %d dragon points\n\r", (count * 1000) );
			send_to_char( buf, ch );
			return;
		}
		ch->pcdata->stats[DEMON_CURRENT] -= (count * 1000);
		send_to_char( "You now can mask other people.\n\r", ch );
		SET_BIT( ch->pcdata->powers[DPOWER_FLAGS], DRA_MASK );
		return;
	}
	else if( !str_cmp( arg, "scry" ))
	{
		if( IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_SCRY))
		{
			send_to_char( "You already can see people who are far away.\n\r", ch);
			return;
		}
		if( ch->pcdata->stats[DEMON_CURRENT] < (count * 1000) )
		{
							  sprintf( buf, "You need %d dragon points\n\r", (count * 1000) );
			send_to_char( buf, ch );
			return;
		}
		ch->pcdata->stats[DEMON_CURRENT] -= (count * 1000);
		send_to_char( "You can now see people who are far away.\n\r", ch );
		SET_BIT( ch->pcdata->powers[DPOWER_FLAGS], DRA_SCRY );
		return;
	}
	else if( !str_cmp( arg, "polymorph" ))
	{
		if( IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_POLYMORPH ))
		{
			send_to_char( "You already can polymorph.\n\r", ch );
			return;
		}
		if( ch->pcdata->powers[dragonage] < D_IMMORTAL )
		{
			send_to_char( "You must be an immortal dragon to learn this power.\n\r", ch );
			return;
		}
		if( ch->pcdata->stats[DEMON_CURRENT] < (count * 1000) )
		{
							  sprintf( buf, "You need %d dragon points\n\r", (count * 1000) );
			send_to_char( buf, ch );
			return;
		}
		ch->pcdata->stats[DEMON_CURRENT] -= (count * 1000);
		send_to_char( "You now can polymorph.\n\r", ch );
		SET_BIT( ch->pcdata->powers[DPOWER_FLAGS], DRA_POLYMORPH );
		return;
	}
	else if( !str_cmp( arg, "luck" ))
	{
		if( IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_LUCK ))
		{
			send_to_char( "You already have extra luck.\n\r", ch );
			return;
		}
		if( ch->pcdata->powers[dragonage] < D_ADULT )
		{
			send_to_char( "You have to be at least an adult dragon to get this power.\n\r", ch );
			return;
		}
		if( ch->pcdata->stats[DEMON_CURRENT] < (count * 1000) )
		{
							  sprintf( buf, "You need %d dragon points\n\r", (count * 1000) );
			send_to_char( buf, ch );
			return;
		}
		ch->pcdata->stats[DEMON_CURRENT] -= (count * 1000);
		send_to_char( "You now have extra luck.\n\r", ch );
		SET_BIT( ch->pcdata->powers[DPOWER_FLAGS], DRA_LUCK );
		return;
	}
	else if( !str_cmp( arg, "fly"	))
	{
		if( IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_FLY ))
		{
			send_to_char( "You already can fly to targets.\n\r", ch );
			return;
		}
		if( ch->pcdata->powers[dragonage] < D_ADULT )
		{
			send_to_char( "You have to be at least an adult dragon to get this power.\n\r", ch );
			return;
		}
		if( ch->pcdata->stats[DEMON_CURRENT] < (count * 1000) )
		{
							  sprintf( buf, "You need %d dragon points\n\r", (count * 1000) );
			send_to_char( buf, ch );
			return;
		}
		ch->pcdata->stats[DEMON_CURRENT] -= (count * 1000);
		send_to_char( "You now can fly to people.\n\r", ch );
		SET_BIT( ch->pcdata->powers[DPOWER_FLAGS], DRA_FLY );
		return;
	}
	else if( !str_cmp( arg, "scales"))
	{
		if( IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_TOUGHNESS ))
		{
			send_to_char( "Your scales are already very tough.\n\r", ch );
			return;
		}
		if( ch->pcdata->powers[dragonage] < D_ANCIENT )
		{
			send_to_char( "You have to be at least a great wyrm to get this power.\n\r", ch);
			return;
		}
		if( ch->pcdata->stats[DEMON_CURRENT] < (count * 1000) )
		{
							  sprintf( buf, "You need %d dragon points\n\r", (count * 1000) );
			send_to_char( buf, ch );
			return;
		}
		ch->pcdata->stats[DEMON_CURRENT] -= (count * 1000);
		send_to_char( "Your scales now are tougher than ever.\n\r", ch );
		SET_BIT( ch->pcdata->powers[DPOWER_FLAGS], DRA_TOUGHNESS );
		return;
	}
	else if( !str_cmp( arg, "peer"	))
	{
		if( IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_PEER	))
		{
			send_to_char( "You already can see people's stats.\n\r", ch );
			return;
		}
		if( ch->pcdata->stats[DEMON_CURRENT] < (count * 1000) )
		{
                       sprintf( buf, "You need %d dragon points\n\r", (count * 1000) );                  
			send_to_char( buf, ch );
			return;
		}
		ch->pcdata->stats[DEMON_CURRENT] -= (count * 1000);
		SET_BIT(ch->pcdata->powers[DPOWER_FLAGS], DRA_PEER);
		send_to_char( "You now can see other people's stats.\n\r", ch );
		return;
	}
	else if( !str_cmp( arg, "magic" ))
	{
		if( IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_MAGIC ))
		{
			send_to_char( "You already have magic control.\n\r", ch );
			return;
		}
		if( ch->pcdata->stats[DEMON_CURRENT] < (count * 1000) )
		{
							  sprintf( buf, "You need %d dragon points\n\r", (count * 1000) );
			send_to_char( buf, ch );
			return;
		}
		ch->pcdata->stats[DEMON_CURRENT] -= (count * 1000);
		send_to_char( "You now have great magical control.\n\r", ch );
		SET_BIT( ch->pcdata->powers[DPOWER_FLAGS], DRA_MAGIC);
		return;
	}
	else
	{
		int x = 0;
		send_to_char( "Valid choices are:\n\r", ch );
		if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_WINGS ) && ch->pcdata->powers[dragonage] >= D_ADULT)
		{
			send_to_char( "Wings,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_FLY	) && ch->pcdata->powers[dragonage] >= D_ADULT )
		{
			send_to_char( " Fly,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_TRUESIGHT ) )
		{
			send_to_char(" Truesight,", ch );
			x++;
			if(x>5){send_to_char("\n\r", ch);x=0;}
		}
		if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_SCRY ) )
		{
			send_to_char( " Scry,", ch );
			x++;
			if( x > 5){send_to_char("\n\r", ch);x = 0;}
		}
		if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_FANGS ) )
		{
			send_to_char( " Fangs,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_CLAWS ) )
		{
			send_to_char( " Claws,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_LICK ) )
		{
			send_to_char( " Lick,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_FROST_BREATH ) && ch->pcdata->powers[dragonage] >= D_MATURE)
		{
			send_to_char( " FrostBreath,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_FIRE_BREATH ) && ch->pcdata->powers[dragonage] >= D_JUVENILE)
		{
			send_to_char( " FireBreath,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_LIGHTNING_BREATH ) && ch->pcdata->powers[dragonage] >= D_YADULT)
		{
			send_to_char( " LightningBreath,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_ACID_BREATH ) && ch->pcdata->powers[dragonage] >= D_VENERABLE )
		{
			send_to_char( " AcidBreath,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_GAS_BREATH ) )
		{
			send_to_char( " Gas Breath,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_PEER ) )
		{
			send_to_char( " Peer,", ch );
			x++;
			if(x > 5){send_to_char("\n\r", ch);x=0;}
		}
		if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_TAIL ) && ch->pcdata->powers[dragonage] >= D_YOUNG )
		{
			send_to_char( " Tail,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_TERROR ) )
		{
			send_to_char( " Terror,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_CONFUSE ) )
		{
			send_to_char( " Confuse,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_MASK ) && ch->pcdata->powers[dragonage] >= D_OLD )
		{
			send_to_char( "Mask,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_MAGIC ) )
		{
			send_to_char( " Magic,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_POLYMORPH ) && ch->pcdata->powers[dragonage] >= D_IMMORTAL )
		{
			send_to_char( " Polymorph,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_LUCK ) && ch->pcdata->powers[dragonage] >= D_ADULT )
		{
			send_to_char( " Luck,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_TOUGHNESS) && ch->pcdata->powers[dragonage] >= D_ANCIENT)
		{
			send_to_char( " Scales,", ch );
			x++;
			if( x > 5 ){send_to_char( "\n\r", ch );x = 0;}
		}
		send_to_char( "\n\r", ch );
		send_to_char( "Some are only avaiable after a certain age. Check helps for ages.\n\r", ch );
		return;
	}

	return;
}


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


  if ( !IS_CLASS(ch, CLASS_DRAGON) ) send_to_char("huh?\n\r", ch);


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

  if( str_cmp(arg, "gem") )
  {
     send_to_char("only gems\n\r", ch);
     return;
  }

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

  if (!IS_NPC(ch))
  

  act("$n eats $p.", ch, obj, NULL, TO_ROOM);
  act("You eat $p.", ch, obj, NULL, TO_CHAR);
  ch->pcdata->stats[DEMON_CURRENT] += obj->value[0];
  if (obj != NULL)
  extract_obj(obj);
  return;
  
}
void do_lick( CHAR_DATA *ch, char *argument )
{
	char arg[MAX_INPUT_LENGTH];
	CHAR_DATA *victim;

	one_argument(argument, arg );

	if( !IS_IMMORTAL(ch) )
	{
	if( !IS_CLASS(ch, CLASS_DRAGON) )
	{
		send_to_char( "Huh?!?\n\r", ch );
		return;
	}
	if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_LICK) )
	{
		send_to_char( "You haven't learned this skill yet.\n\r", ch );
		return;
	}
        if(ch->hit <= 0) return;
	}
        if( arg[0] != '\0' )
        {
	  if ( ( victim = get_char_room( ch, arg ) ) == NULL )
           {
              send_to_char( "They aren't here.\n\r", ch );
              return;
	  }
        }

	if( arg[0] == '\0' ) victim = ch;

  if (victim->loc_hp[6] > 0)
  {
    stc("Your wounds close up and stop bleeding.\n\r",victim);
    victim->loc_hp[6] = 0;
  }

  if ((victim->loc_hp[0] + victim->loc_hp[1] + victim->loc_hp[2] + victim->loc_hp[3] + victim->loc_hp[4] +
victim->loc_hp[5]) != 0)
  {
    stc("Your bones mend themselves together and new limbs grow out of your body.\n\r",victim);
    victim->loc_hp[0] = 0;
    victim->loc_hp[1] = 0;
    victim->loc_hp[2] = 0;
    victim->loc_hp[3] = 0;
    victim->loc_hp[4] = 0;
    victim->loc_hp[5] = 0;
  }


	victim->hit += 250 * ch->pcdata->powers[dragonage];
	victim->move += 250 * ch->pcdata->powers[dragonage];
	victim->mana += 250 * ch->pcdata->powers[dragonage];
	if( victim->hit > victim->max_hit )
		victim->hit = victim->max_hit;
	if( victim->move > victim->max_move )
		victim->move = victim->max_move;
	if( victim->mana > victim->max_mana )
		victim->mana = victim->max_mana;

	update_pos(victim);

	act( "You lick $N's wounds and heal $M.",ch,NULL,victim,TO_CHAR);
	act( "$n licks your wounds and heals $M.",ch,NULL,victim,TO_VICT);
	act( "$n licks $N's wounds and heals $M.",ch,NULL,victim,TO_NOTVICT);
		  gain_condition( ch, COND_FULL, -(number_range(10,30)));
	WAIT_STATE(ch,6);
	return;
}

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

	one_argument( argument, arg );

	if( !IS_IMMORTAL(ch))
	{
	if( !IS_CLASS(ch, CLASS_DRAGON) )
	{
		send_to_char( "Huh?!?\n\r", ch );
		return;
	}
	if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_CONFUSE) )
	{
		send_to_char( "You haven't learned this skill yet.\n\r", ch );
		return;
	}
	}

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

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

	 af.type      = gsn_curse;
	 af.duration  = 5;
	 af.location  = APPLY_HITROLL;
	 af.modifier  = -50;
	 af.bitvector = 0;
	 affect_to_char( victim, &af );

	 af.location  = APPLY_DAMROLL;
	 af.modifier  = -50;
	 affect_to_char( victim, &af );
	 gain_condition( ch, COND_FULL, -(number_range(40,50)));
	 WAIT_STATE(ch,12);

	return;
}

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

	one_argument( argument, arg );

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

	 if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_FLY) )
	 {
	  send_to_char( "You haven't learned this skill yet.\n\r", ch );
	  return;
	 }
	}

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

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

	if ( ( victim = get_char_world( ch, arg ) ) == NULL )
	 {
	  send_to_char( "Nobody by that name.\n\r", ch );
 	  return;
	 }

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

	if ( !IS_IMMUNE(victim, IMM_SUMMON) && !IS_NPC(victim) && !IS_IMMORTAL(ch))
	{
	  send_to_char("You can't find them.\n\r", ch);
	  return;
	}

	 
	act( "You disappear up into the sky.", ch, NULL, NULL, TO_CHAR );
	act( "$n disappears up into the sky.", ch, NULL, NULL, TO_ROOM );
	char_from_room( ch );
	char_to_room( ch, get_room_index(victim->in_room->vnum) );
	act( "You swoop down and land infront of $N", ch, NULL, victim, TO_CHAR );
	act( "$n swoop down and land infront of $N.", ch, NULL, victim, TO_ROOM );
	do_look( ch, "auto" );
	if ( (mount = victim->mount) == NULL ) return;
	char_from_room( mount );
	char_to_room( mount, get_room_index(victim->in_room->vnum) );
	return;
}

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

	 one_argument( argument, arg );

	if (IS_NPC(ch)) return;

	if(!IS_IMMORTAL(ch))
	{
	 if(!IS_CLASS(ch, CLASS_DRAGON))
	 {
	  send_to_char( "Huh?!?\n\r", ch );
	  return;
	 }
	 if(!IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_PEER))
	 {
	  send_to_char( "You don't have the ability to know people's stats.\n\r", ch);
	  return;
	 }
	}

	if( arg[0] == '\0' )
	{
		send_to_char( "Peer at who?\n\r", ch );
		return;
	}
	 if ( ( victim = get_char_room( ch, arg ) ) == NULL )
    {
    if ( ( obj = get_obj_carry( ch, arg ) ) == NULL )
    {
		  send_to_char( "Peer at 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;
	}
	 act("$n examines $N intently.",ch,NULL,victim,TO_NOTVICT);
	 act("$n examines you intently.",ch,NULL,victim,TO_VICT);
    if (IS_NPC(victim)) sprintf(buf, "%s is an NPC.\n\r",victim->short_descr);
    else 
     {
       if      (victim->level == 13) sprintf(buf, "%s is an Owner.\n\r", victim->name);
       else if (victim->level == 12) sprintf(buf, "%s is an Arcahngel.\n\r", victim->name);
       else if (victim->level == 11) sprintf(buf, "%s is a High Judge.\n\r", victim->name);
       else if (victim->level == 10) sprintf(buf, "%s is a Judge.\n\r", victim->name);
       else if (victim->level == 9 ) sprintf(buf, "%s is an Enforcer.\n\r", victim->name);
       else if (victim->level == 8 ) sprintf(buf, "%s is a Quest Maker.\n\r", victim->name);
       else if (victim->level == 7 ) sprintf(buf, "%s is a Builder.\n\r", victim->name);
       else if (victim->level >= 3 ) sprintf(buf, "%s is an Avatar.\n\r", victim->name);
       else sprintf(buf, "%s is a Mortal.\n\r", victim->name);
     }
	 send_to_char(buf,ch);

	 if (!IS_NPC(victim))
	{
		sprintf(buf,"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,"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) && victim->sex == SEX_FEMALE)
	 act("$N is pregnant.",ch,NULL,victim,TO_CHAR);
	return;
}

void do_consume( CHAR_DATA *ch, char *argument )
{
	 OBJ_DATA *corpse;
	 OBJ_DATA *c_next;
	 OBJ_DATA *obj;
	 OBJ_DATA *obj_next;
	char arg[MAX_INPUT_LENGTH];
	char buf[MAX_INPUT_LENGTH];
	int points;

	one_argument( argument, arg );

	 if( !IS_CLASS(ch, CLASS_DRAGON)) return;

	 for ( corpse = ch->in_room->contents; corpse != NULL; corpse = c_next )
	 {
	c_next = corpse->next_content;
	if ( corpse->item_type != ITEM_CORPSE_NPC && corpse->item_type != ITEM_CORPSE_PC)
		 continue;
	points = number_range( 80, 150 * (ch->pcdata->powers[dragonage]) );
	ch->pcdata->stats[DEMON_CURRENT] += points;
	ch->pcdata->stats[DEMON_TOTAL] += points;
	act( "$n savagely devours a corpse.", ch, NULL, NULL, TO_ROOM );
	sprintf( buf, "You gain %d dragon points.\n\r", points );
	send_to_char( buf, ch );
	for ( obj = corpse->contains; obj; obj = obj_next )
	{
		 obj_next = obj->next_content;
		 obj_from_obj( obj );
		 obj_to_room( obj, ch->in_room );
	}

	if (corpse != NULL) extract_obj( corpse );
	 }
	return;
}


void do_dgem ( CHAR_DATA *ch, char *argument )
{
	 char arg1[MAX_INPUT_LENGTH];
	 char buf[MAX_STRING_LENGTH];
	 OBJ_INDEX_DATA *pObjIndex;
	 OBJ_DATA *obj;
	 int value;

	 argument = one_argument( argument, arg1 );

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

	 if ( IS_NPC(ch) || (ch->pcdata->stats[DEMON_CURRENT] < 1 ) )
	 {
	send_to_char("You are unable to make a gem.\n\r",ch);
	return;
	 }
	 else if ( arg1[0] == '\0' || !is_number( arg1 ) )
	 {
	send_to_char("Please specify a value for gem.\n\r",ch);
	return;
	 }
	 else
	 {
		  value = atoi( arg1 );
	if ( value < 1 || value > 100000 )
		  {
		 send_to_char( "Gem value should have a value between 1 and 100000.\n\r", ch );
		 return;
		  }
	else if ( value > ch->pcdata->stats[DEMON_CURRENT] )
		  {
		 sprintf(buf,"You only have %d dragon points left to put into gems.\n\r",ch->pcdata->stats[DEMON_CURRENT]);
	    send_to_char( buf, ch );
	    return;
        }
	 }

	 if ( ( pObjIndex = get_obj_index( OBJ_VNUM_PROTOPLASM ) ) == NULL )
    {
	send_to_char( "Error...missing object, please inform KaVir.\n\r", ch );
	return;
    }

	 ch->pcdata->stats[DEMON_CURRENT] -= value;
	 ch->pcdata->stats[DEMON_TOTAL]	 -= value;
	 if (ch->pcdata->stats[DEMON_CURRENT]  < 0) ch->pcdata->stats[DEMON_CURRENT] = 0;
    obj = create_object( pObjIndex, value );
    obj->value[0] = value;
    obj->level = 1;
    obj->cost = value*1000;
	 obj->item_type = ITEM_DRAGONGEM;
    obj_to_char(obj,ch);
	 if (obj->questmaker != NULL) free_string(obj->questmaker);
    obj->questmaker = str_dup(ch->name);
    free_string( obj->name );
	 obj->name = str_dup( "dragon gem" );
    sprintf(buf,"a %d point gem",value);
    free_string( obj->short_descr );
    obj->short_descr = str_dup( buf );
    sprintf(buf,"A %d point gem lies on the floor.",value);
    free_string( obj->description );
    obj->description = str_dup( buf );

		act( "A tear rolls down your cheek and crystalizes into $p.", ch, obj, NULL, TO_CHAR );
   	act( "A tear rolls down $n's cheek and crystalizes into $p.", ch, obj, NULL, TO_ROOM );

    return;
}


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

	 char arg1[MAX_STRING_LENGTH];
	 OBJ_INDEX_DATA *pObjIndex;
	 OBJ_DATA *obj;
    int vnum = 0;
    int cost = 0;

	 argument = one_argument(argument, arg1);

    if( !IS_CLASS(ch, CLASS_DRAGON))
    {
	stc( "Huh?\n\r",ch);
	return;
	 }
	 if( arg1[0] == '\0' )
	 {
	stc( "Usage: dragonarmor <piece>\n\r",ch);
	stc( "piece = Ring, Collar, Shirt, Helmet, Leggings, Boots, Gloves, Armblades, Cape, Belt, Bracer, Mask, Claws\n\r",ch);
	stc( "dragonarmor costs 15,000 dps.\n\r",ch);
	return;
	 }

	 if     ( !str_cmp(arg1,"ring"))      {cost=10000;vnum=19200;}
	 else if( !str_cmp(arg1,"bracer"))    {cost=10000;vnum=19201;}
	 else if( !str_cmp(arg1,"shirt"))     {cost=10000;vnum=19202;}
	 else if( !str_cmp(arg1,"helmet"))    {cost=10000;vnum=19203;}
	 else if( !str_cmp(arg1,"leggings"))  {cost=10000;vnum=19204;}
	 else if( !str_cmp(arg1,"boots"))     {cost=10000;vnum=19205;}
	 else if( !str_cmp(arg1,"gloves"))    {cost=10000;vnum=19206;}
	 else if( !str_cmp(arg1,"armblades")) {cost=10000;vnum=19207;}
	 else if( !str_cmp(arg1,"cape"))      {cost=10000;vnum=19208;}
	 else if( !str_cmp(arg1,"belt"))      {cost=10000;vnum=19209;}
	 else if( !str_cmp(arg1,"collar"))    {cost=10000;vnum=19210;}
	 else if( !str_cmp(arg1,"mask"))      {cost=10000;vnum=19211;}
         else if( !str_cmp(arg1,"claws"))     {cost=10000;vnum=19213;}
	 else
	 {
	stc( "Usage: dragonarmor <piece>\n\r",ch);
	stc( "piece = Ring, Collar, Shirt, Helmet, Leggings, Boots, Gloves, Armblades, Cape, Belt, Bracer, Mask, Claws\n\r",ch);
	stc( "green costs 5,000 dps, black = 10,000 dps, blue = 15,000 dps, red = 20,000 dps.\n\r",ch);
	return;
	 }

	 if( ch->pcdata->stats[DEMON_CURRENT] < cost )
	 {
	stc( "You don't have enough dragon points.\n\r",ch);
	return;
	 }
	 if ( vnum == 0 || (pObjIndex = get_obj_index( vnum )) == NULL)
	 {
	send_to_char("Missing object, please inform GryphonHawk.\n\r",ch);
	return;
	 }
	ch->pcdata->stats[DEMON_CURRENT]	-= cost;
	ch->pcdata->stats[DEMON_TOTAL]	-= cost;
	obj = create_object(pObjIndex, 50);
	obj->questowner = str_dup(ch->name);
	obj_to_char(obj, ch);
	act("$p appears in your hands.",ch,obj,NULL,TO_CHAR);
	act("$p appears in $n's hands.",ch,obj,NULL,TO_ROOM);

	return;
}

void do_age( CHAR_DATA *ch, char *argument )
{
    char buf[MAX_INPUT_LENGTH];
    if( !IS_CLASS(ch, CLASS_DRAGON)) return;

    if(ch->pcdata->stats[DEMON_CURRENT] < (ch->pcdata->powers[dragonage] * 30000))
      {
	sprintf( buf, "You need %d dragon points to age \n\r", (ch->pcdata->powers[dragonage] * 30000));
	  send_to_char( buf, ch );
	return;
      }
    if ( ch->practice < (ch->pcdata->powers[dragonage]*100))
      {
        sprintf(buf,"It costs %d points of primal to age.\n\r",(ch->pcdata->powers[dragonage]*100));
          send_to_char(buf,ch);
        return;
      }

    if(ch->max_hit < (ch->pcdata->powers[dragonage] * 5000))
      {
	sprintf( buf, "You need %d hitpoints to age \n\r", (ch->pcdata->powers[dragonage] * 5000));
	  send_to_char( buf, ch );
	return;
      }
	 if(ch->pcdata->powers[dragonage] == 12 && !IS_IMMORTAL(ch))
      {
	sprintf( buf, "You cannot age any further\n\r");
 	  send_to_char( buf, ch );
 	return;
		}
    if (IS_IMMORTAL(ch))
      {
	  ch->pcdata->powers[dragonage] = 13;
	  return;
      }
    ch->pcdata->stats[DEMON_CURRENT] -= (ch->pcdata->powers[dragonage] * 30000);
    ch->practice -= (100 * ch->pcdata->powers[dragonage]);
    ch->pcdata->powers[dragonage] +=1;
    send_to_char( "You have aged.\n\r", ch );
    return;
}


void do_fbreath(CHAR_DATA *ch, char *argument)
{
  CHAR_DATA *victim;
  int i=0;
  int dam = 0;
  int chance =0;
  char buf[MAX_STRING_LENGTH];
  char buf2[MAX_STRING_LENGTH];

  if (IS_NPC(ch)) return;
  if (!IS_CLASS(ch, CLASS_DRAGON))
  {
	 send_to_char("Huh?\n\r",ch);
	 return;
  }
  if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_FIRE_BREATH ))
  {
	 send_to_char("You haven't learned how to breath fire yet.\n\r",ch);
	 return;
  }
  if (ch->mana < 1000 )
  {
	 send_to_char("You dont have enough mana.\n\r",ch);
	 return;
  }
  if ((victim = ch->fighting) == NULL)
  {
	 send_to_char( "You aren't fighting anyone.\n\r", ch );
	 return;
  }
  ch->mana -= 1000;

  chance = number_range (1, (100 + ch->pcdata->powers[dragonage]+ch->lstatus));

  if (chance <= 7) i = 1;
  if (chance > 7 && chance <= 22)   i = 2;
  if (chance > 22 && chance <= 32)   i = 3;
  if (chance > 32 && chance <= 52)   i = 4;
  if (chance > 52 && chance <= 90)   i = 5;
  if (chance > 90 && chance <= 94)   i = 6;
  if (chance > 94 && chance <= 110)  i = 7;
  if (chance > 110 && chance <= 125) i = 8;
  if (chance > 125 && chance <= 128) i = 9;
  if (chance > 128 ) i = 10;

  for(i=i;i>0;i--)
   {
     dam = number_range(1500 , 400 * (ch->lstatus+ch->pcdata->powers[dragonage]));
     if (dam < 1500) dam = 1500;
     sprintf(buf, "%s's blast of #rf#Rl#ra#Rm#re #Rimmolates#n you [#r%d#n]\n\r", ch->name, dam);
     send_to_char( buf, victim );
     sprintf(buf2, "Your blast of #rf#Rl#ra#Rm#re #Rimmolates#n %s [#r%d#n]\n\r",victim->name, dam);
     send_to_char( buf2, ch );
     act( "$n's blast of #rf#Rl#ra#Rm#re #Rimmolates#n $N",ch,NULL,victim,TO_NOTVICT);
     fire_effect(victim,ch->explevel,dam,TARGET_CHAR);
     hurt_person(ch,victim,dam);
     if (victim->hit < 1) break;
   }
  if (!IS_AFFECTED(victim, AFF_FLAMING))
    SET_BIT(victim->affected_by, AFF_FLAMING);
  WAIT_STATE(ch,12);
  return;
}



void do_lbreath(CHAR_DATA *ch, char *argument)
{
  CHAR_DATA *victim;
  int i=0;
  int dam = 0;
  int chance =0;
  char buf[MAX_STRING_LENGTH];
  char buf2[MAX_STRING_LENGTH];

  if (IS_NPC(ch)) return;
  if (!IS_CLASS(ch, CLASS_DRAGON))
  {
	 send_to_char("Huh?\n\r",ch);
	 return;
  }
  if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_LIGHTNING_BREATH ))
  {
	 send_to_char("You haven't learned how to breath lightning yet.\n\r",ch);
	 return;
  }
  if (ch->mana < 1000 )
  {
	 send_to_char("You dont have enough mana.\n\r",ch);
	 return;
  }
  if ((victim = ch->fighting) == NULL)
  {
	 send_to_char( "You aren't fighting anyone.\n\r", ch );
	 return;
  }
  ch->mana -= 1000;
  chance = number_range (1, (100 + ch->pcdata->powers[dragonage]+ch->lstatus));

  if (chance <= 7) i = 1;
  else if (chance > 7 && chance <= 22)   i = 2;
  else if (chance > 22 && chance <= 32)   i = 3;
  else if (chance > 32 && chance <= 52)   i = 4;
  else if (chance > 52 && chance <= 90)   i = 5;
  else if (chance > 90 && chance <= 94)   i = 6;
  else if (chance > 94 && chance <= 110)  i = 7;
  else if (chance > 110 && chance <= 125) i = 8;
  else if (chance > 125 && chance <= 128) i = 9;
  else if (128 < chance ) i = 10;

  for(i=i;i>0;i--)
    {
	dam = number_range(1000 , 400 * (ch->lstatus+ch->pcdata->powers[dragonage]));
	if (dam < 1500) dam =1500;
	sprintf(buf, "%s's blast of #yl#oi#yg#oh#yt#on#yi#on#yg #yelectrifies#n you [#y%d#n]\n\r", ch->name, dam);
	send_to_char( buf, victim );
	sprintf(buf2,"Your blast of #yl#oi#yg#oh#yt#on#yi#on#yg #yelectrifes#n %s [#y%d#n]\n\r",victim->name, dam);
	send_to_char( buf2, ch );
	act( "$n's blast of #yl#oi#yg#oh#yt#on#yi#on#yg #yelectrifes#n $N.",ch,NULL,victim,TO_NOTVICT);
	hurt_person(ch,victim,dam);
	if (victim->hit < 1) break;
	shock_effect(victim,ch->explevel,dam,TARGET_CHAR);
    }
    chance = number_range (1,5);
    if(ch->pcdata->powers[DRAGON_COLOR] == 3) chance += 2;
    if(ch->pcdata->powers[DRAGON_COLOR] ==12) chance += 2;
    if (chance >= 5)
      {
        act( "Your blast of #yl#oi#yg#oh#yt#on#yi#on#yg#n stuns $N.",ch,NULL,victim,TO_CHAR);
        act( "$n's blast of #yl#oi#yg#oh#yt#on#yi#on#yg stuns you.",ch,NULL,victim,TO_VICT);
        act( "$n's blast of #yl#oi#yg#oh#yt#on#yi#on#yg stuns $N.",ch,NULL,victim,TO_NOTVICT);
        victim->position = POS_STUNNED;
      }
  WAIT_STATE(ch,12);
  return;
}



void do_gbreath(CHAR_DATA *ch, char *argument)
{
	 CHAR_DATA *vch;
	 CHAR_DATA *vch_next;
	 char buf[MAX_STRING_LENGTH];
	 char buf2[MAX_STRING_LENGTH];
	 int dam;
         int i = 0;
	 int chance = 0;


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

	 if (ch->mana < 100)
	 {
		send_to_char ("You dont have enough mana.\n\r",ch);
		return;
	 }

        chance = (number_range (1, (100+ch->lstatus+ch->pcdata->powers[dragonage])));
	if (chance <= 42) i = 1;
	else if (chance > 42 && chance <= 72)   i = 2;
	else if (chance > 72 && chance <= 90)   i = 3;
	else if (chance > 90 && chance <= 99)   i = 4;
	else if (chance > 99 && chance <= 120)  i = 5;
        else if (121 < chance ) i = 6;

   for(i=i;i>0;i--)
   {
	  send_to_char("#GYou belch forth a cloud of poisonous gas#n.\n\r",ch);
     for ( vch = ch->in_room->people; vch!=NULL;vch = vch_next)     
      {
        vch_next = vch->next_in_room;
        if (can_see(ch,vch))
	if ( IS_NPC(ch) ? !IS_NPC(vch) : IS_NPC(vch) )
	{
          dam = number_range((ch->damcap[DAM_CAP] -500), (ch->damcap[DAM_CAP]+(ch->lstatus*50)));
	  sprintf(buf, "%s's #sblast of gas#n chokes you [#G%d#n]\n\r", ch->name, dam);
	  send_to_char( buf, vch );
	  sprintf(buf2, "Your #sblast of gas#n chokes %s [#G%d#n]\n\r",vch->name, dam);
	  send_to_char( buf2, ch );
	  act( "$n's #sblast of gas#n chokes $N.",ch,NULL,vch,TO_NOTVICT);
	}
      }
    }
  ch->mana -= 100;
  WAIT_STATE (ch, 3);
  return;
}



void do_abreath(CHAR_DATA *ch, char *argument)
{
	CHAR_DATA *victim;
		  int dam = 0;
	int damp = 0;
	int vorpchance = 0;
	bool is_vorpal = FALSE;
	char buf[MAX_STRING_LENGTH];
	char buf2[MAX_STRING_LENGTH];


  if (IS_NPC(ch)) return;
  if (!IS_CLASS(ch, CLASS_DRAGON))
   {
     send_to_char("Huh?\n\r",ch);
     return;
   }
  if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_ACID_BREATH ))
   {
     send_to_char("You haven't learned how to breath acid yet.\n\r",ch);
     return;
   }
  if (ch->mana < 100 )
  {
	 send_to_char("You dont have enough mana.\n\r",ch);
	 return;
  }
  if ((victim = ch->fighting) == NULL)
  {
	 send_to_char( "You aren't fighting anyone.\n\r", ch );
	 return;
  }
  ch->mana -= 100;
  dam = number_range(1000 , (3000+(ch->lstatus*100)));
  sprintf(buf, "%s's blast of acid covers you [#C%d#n]\n\r", ch->name, dam);
  send_to_char( buf, victim );
  sprintf(buf2, "Your blast of acid covers %s [#C%d#n]\n\r",victim->name, dam);
  send_to_char( buf2, ch );
  act( "$n's blast of acid covers $N.",ch,NULL,victim,TO_NOTVICT);
  hurt_person(ch,victim,dam);
  acid_effect(victim,ch->explevel,dam,TARGET_CHAR);
  vorpchance = number_range (1, 100);
  vorpchance += (2 * ch->pcdata->powers[dragonage]);
  if ( ch->pcdata->powers[DRAGON_COLOR] == 7 ) vorpchance += 35;   // Black Dragon Acid Bonus
  if ( ch->pcdata->powers[DRAGON_COLOR] == 15 ) vorpchance += 25;  // Topaz Dragon Acid Bonus
  if ( vorpchance >= 40) is_vorpal = TRUE;
  if ( is_vorpal )
  {
    ch->mana-=9000;
    damp=number_range(1,8);
    if ( damp == 1 )
     {
 	return;
     }
    else if ( damp == 2 )
     {
 	return;
     }
    else if ( damp == 3 )
     {
 	return;
     }
    else if ( damp == 4 )
     {
	return;
     }
    else if ( damp == 5 ) 
     {
	return;
     }
    else if ( damp == 6 )
     {
	return;
     }
    else if ( damp == 7 )
     {
	if (!IS_ARM_L(victim,LOST_ARM))
	 {
	  act("Your acid burns off $N's arm.", ch, NULL, victim, TO_CHAR);
	  act("$n's acid burns off $N's arm.", ch, NULL, victim, TO_NOTVICT);
	  act("$n's acid burns off your arm.", ch, NULL, victim, TO_VICT);
	  make_part(victim,"arm");
	  SET_BIT(victim->loc_hp[2],LOST_ARM);
	  if (!IS_BLEEDING(victim,BLEEDING_ARM_L)) SET_BIT(victim->loc_hp[6],BLEEDING_ARM_L);
	  if (IS_BLEEDING(victim,BLEEDING_HAND_L)) REMOVE_BIT(victim->loc_hp[6],BLEEDING_HAND_L);
	}
       else if (!IS_ARM_R(victim,LOST_ARM))
	{
	  act("Your acid burns off $N's arm.", ch, NULL, victim, TO_CHAR);
	  act("$n's acid burns $N's arm.", ch, NULL, victim, TO_NOTVICT);
	  act("$n's acid burns off your arm.", ch, NULL, victim, TO_VICT);
	  make_part(victim,"arm");
	  SET_BIT(victim->loc_hp[3],LOST_ARM);
	  if (!IS_BLEEDING(victim,BLEEDING_ARM_R)) SET_BIT(victim->loc_hp[6],BLEEDING_ARM_R);
	  if (IS_BLEEDING(victim,BLEEDING_HAND_R)) REMOVE_BIT(victim->loc_hp[6],BLEEDING_HAND_R);
	}
       else
	{
	  return;
	}
     }
    else if ( damp == 8 )
     {
	if (!IS_LEG_L(victim,LOST_LEG))
	{
	  act("Your acid burns off $N's leg at the hip.", ch, NULL, victim, TO_CHAR);
	  act("$n's acid burns off $N's leg at the hip.", ch, NULL, victim, TO_NOTVICT);
	  act("$n's acid burns off your leg at the hip.", ch, NULL, victim, TO_VICT);
	  make_part(victim,"leg");
	  SET_BIT(victim->loc_hp[4],LOST_LEG);
	  if (!IS_BLEEDING(victim,BLEEDING_LEG_L)) SET_BIT(victim->loc_hp[6],BLEEDING_LEG_L);
	  if (IS_BLEEDING(victim,BLEEDING_FOOT_L)) REMOVE_BIT(victim->loc_hp[6],BLEEDING_FOOT_L);
	}
	else if (!IS_LEG_R(victim,LOST_LEG))
	{
	  act("Your acid burns off $N's leg at the hip.", ch, NULL, victim, TO_CHAR);
	  act("$n's acid burns off $N's leg at the hip.", ch, NULL, victim, TO_NOTVICT);
	  act("$n's acid burns off your leg at the hip.", ch, NULL, victim, TO_VICT);
	  make_part(victim,"leg");
	  SET_BIT(victim->loc_hp[5],LOST_LEG);
	  if (!IS_BLEEDING(victim,BLEEDING_LEG_R)) SET_BIT(victim->loc_hp[6],BLEEDING_LEG_R);
	  if (IS_BLEEDING(victim,BLEEDING_FOOT_R)) REMOVE_BIT(victim->loc_hp[6],BLEEDING_FOOT_R);
	}
	else
	{
		return;
	}
     }
 }

 if (!IS_AFFECTED(victim, AFF_FLAMING))
 SET_BIT(victim->affected_by, AFF_FLAMING);
 WAIT_STATE(ch,12);
 return;
}



void do_cbreath( CHAR_DATA *ch, char *argument )
{
	 CHAR_DATA *victim;
	 int i=0;
	 int dam = 0;
	 int chance =0;
	 char buf[MAX_STRING_LENGTH];
	 char buf2[MAX_STRING_LENGTH];

	 if (IS_NPC(ch)) return;

	 if (!IS_CLASS(ch, CLASS_DRAGON))
	  {
		  send_to_char("Huh?\n\r",ch);
		  return;
	  }
	 if ( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_FROST_BREATH ) )
	  {
		  send_to_char("You haven't learned how to breath frost yet.\n\r",ch);
		  return;
	  }

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

	 if (ch->mana < 1000)
	  {
		  send_to_char("You don't have enough mana.\n\r", ch);
		  return;
	  }
  chance = number_range (1, (100 + ch->pcdata->powers[dragonage]+ch->lstatus));

  if (chance <= 7) i = 1;
  else if (chance > 7 && chance <= 22)   i = 2;
  else if (chance > 22 && chance <= 32)   i = 3;
  else if (chance > 32 && chance <= 52)   i = 4;
  else if (chance > 52 && chance <= 90)   i = 5;
  else if (chance > 90 && chance <= 94)   i = 6;
  else if (chance > 94 && chance <= 110)  i = 7;
  else if (chance > 110 && chance <= 125) i = 8;
  else if (chance > 125 && chance <= 128) i = 9;
  else if (128 < chance ) i = 10;

  for(i=i;i>0;i--)
	  {
		dam = number_range(1000 , 400 * (ch->lstatus+ch->pcdata->powers[dragonage]));
		if (dam < 1500) dam =1500;
		sprintf(buf, "%s's cone of #Cf#7r#Co#7s#Ct#n freezes you [#C%d#n]\n\r", ch->name, dam);
		send_to_char( buf, victim );
		sprintf(buf2, "Your cone of #Cf#7r#Co#7s#Ct#n freezes %s [#C%d#n]\n\r",victim->name, dam);
		send_to_char( buf2, ch );
		act( "$n's cone of #Cf#7r#Co#7s#Ct#n freezes $N.",ch,NULL,victim,TO_NOTVICT);
		hurt_person(ch,victim,dam);
		if (victim->hit < 1) break;
		cold_effect(victim, dam, TARGET_CHAR);
	  }

  ch->mana = ch->mana - 1000;
  WAIT_STATE(ch,12);
  WAIT_STATE(victim, 6);
  return;
}

void do_nest( 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_DRAGON))
	 {
	send_to_char("Huh?\n\r",ch);
	return;
	 }
	 sprintf( buf, "                 #0[#cThe Lords of the Skies#c]\n\r");
	 send_to_char( buf, ch );
	 send_to_char("#0[      #cName      #0] [   #cHits  #0] [   #cMana  #0] [   #cMove  #0] [  #cAge  #0]\n\r", ch );
	 for ( gch = char_list; gch != NULL; gch = gch->next )
	 {
	if ( IS_NPC(gch) ) continue;
	if ( !IS_CLASS(gch, CLASS_DRAGON))  continue;
	sprintf( buf,"#0[#c%-16s#0] [#c%-9d#0] [#c%-9d#0] [#c%-9d#0] [   #c%-2d  #0]\n\r",
	capitalize( gch->name ),
	gch->hit,gch->mana,gch->move,
	gch->pcdata->powers[dragonage]);
	send_to_char( buf, ch );
	 }
	 return;
}

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

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

		if( !IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_FLY) )
		{
		send_to_char( "You haven't learned this skill yet.\n\r", ch );
		return;
		}
	}

	 if ( arg[0] == '\0' )
	 {
		send_to_char( "Swoop to whom?\n\r", ch );
		return;
	 }
	 if ( ch->position == POS_FIGHTING )
	 {
		send_to_char( "No way! You are fighting.\n\r", ch );
		return;
	 }

	 if ( ( victim = get_char_world( ch, arg ) ) == NULL )
	 {
		send_to_char( "Nobody by that name.\n\r", ch );
		return;
	 }

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

	if ( !IS_IMMUNE(victim, IMM_SUMMON) && !IS_NPC(victim) && !IS_IMMORTAL(ch) && victim->fight_timer == 0)
	{
		send_to_char("You can't find them.\n\r", ch);
		return;
	}


	act( "You disappear up into the sky.", ch, NULL, NULL, TO_CHAR );
	act( "$n disappears up into the sky.", ch, NULL, NULL, TO_ROOM );
	char_from_room( ch );
	char_to_room( ch, get_room_index(victim->in_room->vnum) );
 	WAIT_STATE(ch,8);
	if (!IS_NPC(ch) && IS_CLASS(ch, CLASS_DRAGON))
	{
	  act("You swoop down from the sky onto $N.",ch,NULL,victim,TO_CHAR);
	  act("$n swoops down from the sky onto $N.",ch,NULL,victim,TO_NOTVICT);
	  act("$n swoops down from the sky onto you.",ch,NULL,victim,TO_VICT);
	  if (IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_CLAWS) ) one_hit( ch, victim, gsn_claws,1);
	  if (IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_CLAWS) ) one_hit( ch, victim, gsn_claws,1);
	  if (IS_SET(ch->pcdata->powers[DPOWER_FLAGS], DRA_FANGS) ) one_hit( ch, victim, gsn_fangs,1);
	}
	return;
}

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

	if (!IS_CLASS(ch, CLASS_DRAGON) || !IS_SET(ch->pcdata->powers[DPOWER_FLAGS],DRA_TRUESIGHT))
	 {
	  send_to_char("Huh?\n\r", ch );
	  return;
	 }

	 if ( IS_SET(ch->act, PLR_HOLYLIGHT) )
	 {
		  REMOVE_BIT(ch->act, PLR_HOLYLIGHT);
		  send_to_char( "Your senses return to normal.\n\r", ch );
	 }
	 else
	 {
		  SET_BIT(ch->act, PLR_HOLYLIGHT);
		  send_to_char( "Your senses increase to incredible proportions.\n\r", ch);
	 }

	return;
}


void do_breathforge(CHAR_DATA *ch, char *argument)
{
	 OBJ_DATA *obj;

        if (!IS_CLASS(ch,CLASS_DRAGON))
          {
             send_to_char("huh?\n\r",ch);
             return;
          }
	if (ch->pcdata->powers[dragonage] < 12 )
	  {
		 send_to_char("You have earned the power to forge items yet.\n\r",ch);
		 return;
	  }
	if ( ch->practice < 1500)
	  {
		 send_to_char("It costs 1500 primal to forge an item.\n\r",ch);
		 return;
	  }
	if (argument[0] == '\0')
	  {
		 send_to_char("Which item do you wish to forge?\n\r", ch);
		 return;
	  }
	if ( (obj = get_obj_carry(ch, argument)) == NULL)
	  {
		 send_to_char("You are not carrying that item.\n\r", ch);
		 return;
	  }
	if (IS_SET(obj->quest,QUEST_RELIC))
	  {
		send_to_char("Not on a Relic.\n\r",ch);
		return;
	  }
	if (obj->item_type == ITEM_WEAPON)
	  {
		 obj->value[1] += 100;
		 obj->value[2] += 100;
		 obj->level     =  50;
		 oset_affect(ch,obj,50,APPLY_HITROLL,TRUE);
		 oset_affect(ch,obj,50,APPLY_DAMROLL,TRUE);
		 SET_BIT(obj->quest,QUEST_RELIC);
		 obj->condition = 100;
		 obj->toughness = 100;
		 obj->resistance = 1;
		 act("You temper $p in a blast of flame.", ch, obj, NULL, TO_CHAR);
		 act("$n tempers $p in a blast of flame.", ch, obj, NULL, TO_ROOM);
		 if(!IS_SET(obj->weapflags, WEAPON_FLAMING)) SET_BIT(obj->weapflags, WEAPON_FLAMING);
		 ch->practice -= 1500;
		 WAIT_STATE(ch, 8);
		 return;
	  }
	if (obj->item_type == ITEM_ARMOR)
	  {
		obj->value[0] += 50;
		oset_affect(ch,obj,30,APPLY_HITROLL,TRUE);
		oset_affect(ch,obj,30,APPLY_DAMROLL,TRUE);
		oset_affect(ch,obj,-50,APPLY_AC,TRUE);
		SET_BIT(obj->quest,QUEST_RELIC);
		obj->condition = 100;
		obj->toughness = 100;
		obj->resistance = 1;
		act("You temper $p in a blast of flame.", ch, obj, NULL, TO_CHAR);
		act("$n tempers $p in a blast of flame.", ch, obj, NULL, TO_ROOM);
		ch->practice -= 1500;
		WAIT_STATE(ch, 8);
		return;
	  }

}