cotn25/area/
cotn25/src/
/***************************************************************************
 *  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.                                                  *
 ***************************************************************************/

/*********************************************
 * Hydra, another class by Xrakisis          *
 *********************************************/

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


void do_hydraform( CHAR_DATA *ch, char *argument )
{
    char arg [MAX_INPUT_LENGTH];
    char buf [MAX_STRING_LENGTH]; 
    argument = one_argument( argument, arg ); 

    if (IS_NPC(ch)) return;

    if (!IS_CLASS(ch, CLASS_HYDRA) && !IS_CLASS(ch, CLASS_NAZGUL))
    {
	send_to_char("Hydra Only?\n\r",ch);
	return;
    }
    if (IS_POLYAFF(ch, POLY_ZULOFORM))
    {   
        REMOVE_BIT(ch->polyaff, POLY_ZULOFORM);
        REMOVE_BIT(ch->affected_by, AFF_POLYMORPH);
        act( "You Transform into a Lesser Serpent.", ch, NULL, NULL, TO_CHAR );
        act( "$n's Transforms into a Lesser Serpent.", ch, NULL, NULL, TO_ROOM);
        ch->damroll -= 400;
        ch->hitroll -= 400;
        ch->armor   += 500;
        free_string( ch->morph );
        ch->morph = str_dup( "" );
        return;
    }
    else if (IS_AFFECTED(ch,AFF_POLYMORPH))
    {
send_to_char("#0You Cant Hydra Form While Changed#n.\n\r",ch);
return;
}
    
        if (ch->stance[0] != -1) do_stance(ch,"");
	if (ch->mounted == IS_RIDING) do_dismount(ch,"");
        act( "You Grow Into a Massive #RH#rY#7D#rR#RA#n.", ch, NULL, NULL, TO_CHAR);
        act( "$n's Grows into an Imposing Multi-Headed #RH#rY#7D#rR#RA#n.", ch, NULL, NULL, TO_ROOM );
        SET_BIT(ch->polyaff, POLY_ZULOFORM);
        SET_BIT(ch->affected_by, AFF_POLYMORPH);
        sprintf(buf, "%s The Monstrous Hydra", ch->name);
        free_string( ch->morph );
        ch->morph = str_dup( buf );
        ch->damroll += 400;
	  ch->hitroll += 400;
        ch->armor   -= 500;
        return;
    }
  

void do_scalebuy( CHAR_DATA *ch, char *argument )
{
  OBJ_INDEX_DATA *pObjIndex;
  OBJ_DATA *obj;
  char arg[MAX_INPUT_LENGTH];
  int vnum = 0;

  argument = one_argument( argument, arg );

  if (IS_NPC(ch)) return;
    if (!IS_CLASS(ch, CLASS_HYDRA) && !IS_CLASS(ch, CLASS_TYPHON)
    && !IS_CLASS(ch, CLASS_NAZGUL) && !IS_CLASS(ch, CLASS_BAATEZU))

  {
    send_to_char("Huh.\n\r",ch);
    return;
  }

  if (arg[0] == '\0')
  {
  send_to_char("Type the Gemtype for each Scale                   #n\n\r",ch);
  send_to_char("Diamond Onyx Emerald Sapphire Ruby                   #n\n\r",ch);
  send_to_char("Jade Pearl Topaz Amethyst Opal                   #n\n\r",ch);
  send_to_char("Lazuli Chaos Dark Beast                   #n\n\r",ch);

   return;
  }

  if ( ch->pcdata->quest < 40000 )
  {
    send_to_char("You don't have the 40K qps needed.\n\r",ch);
    return;
  }
  if      (!str_cmp(arg,"diamond"        )) vnum = 94084;
  else if (!str_cmp(arg,"onyx"      )) vnum = 94085;
  else if (!str_cmp(arg,"emerald"       )) vnum = 94086;
  else if (!str_cmp(arg,"sapphire"      )) vnum = 94087;
  else if (!str_cmp(arg,"ruby"    )) vnum = 94088;
  else if (!str_cmp(arg,"jade"       )) vnum = 94089;
  else if (!str_cmp(arg,"pearl"      )) vnum = 94090;
  else if (!str_cmp(arg,"topaz"     )) vnum = 94091;
  else if (!str_cmp(arg,"amethyst"        )) vnum = 94092;
  else if (!str_cmp(arg,"opal"        )) vnum = 94093;
  else if (!str_cmp(arg,"lazuli"      )) vnum = 94094;
  else if (!str_cmp(arg,"chaos"        )) vnum = 94095;
  else if (!str_cmp(arg,"dark"        )) vnum = 94096;
  else if (!str_cmp(arg,"beast"        )) vnum = 94097;
  else
  {
    do_scalebuy(ch,"");
    return;
  }
  if ( vnum == 0 || (pObjIndex = get_obj_index( vnum )) == NULL)
  {
    send_to_char("Missing object, please inform Xrakisis .\n\r",ch);
    return;
  }
  if(!IS_IMMORTAL(ch)) ch->pcdata->quest -= 40000;
  obj = create_object(pObjIndex, 50);
  obj->questowner = str_dup(ch->pcdata->switchname);
  obj_to_char(obj, ch);
  act("You transform the 40K qp into $p.",ch,obj,NULL,TO_CHAR);
  act("$n forms $p out of 40K qp.",ch,obj,NULL,TO_ROOM);
  return;
}



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

  argument = one_argument( argument, arg );
  if (IS_NPC(ch)) return;
    if (!IS_CLASS(ch, CLASS_HYDRA))
  {
    send_to_char("#0This is a Hydra Ability#n\n\r",ch);
    return;
  }
  if (arg[0] == '\0')
  {



  if (ch->pcdata->powers[HYDRA_POWER] == 0)
      send_to_char("#0Power     #0[#R**********#0]#n\n\r",ch);
  if (ch->pcdata->powers[HYDRA_POWER] == 1)
      send_to_char("#0Power     #0[#G*#R*********#0]#n\n\r",ch);
  if (ch->pcdata->powers[HYDRA_POWER] == 2)
      send_to_char("#0Power     #0[#G**#R********#0]#n\n\r",ch);
  if (ch->pcdata->powers[HYDRA_POWER] == 3)
      send_to_char("#0Power     #0[#G***#R*******#0]#n\n\r",ch);
  if (ch->pcdata->powers[HYDRA_POWER] == 4)
      send_to_char("#0Power     #0[#G****#R******#0]#n\n\r",ch);
  if (ch->pcdata->powers[HYDRA_POWER] == 5)
      send_to_char("#0Power     #0[#G*****#R*****#0]#n\n\r",ch);
  if (ch->pcdata->powers[HYDRA_POWER] == 6)
      send_to_char("#0Power     #0[#G******#R****#0]#n\n\r",ch);
  if (ch->pcdata->powers[HYDRA_POWER] == 7)
      send_to_char("#0Power     #0[#G*******#R***#0]#n\n\r",ch);
  if (ch->pcdata->powers[HYDRA_POWER] == 8)
      send_to_char("#0Power     #0[#G********#R**#0]#n\n\r",ch);
  if (ch->pcdata->powers[HYDRA_POWER] == 9)
      send_to_char("#0Power     #0[#G*********#R*#0]#n\n\r",ch);
  if (ch->pcdata->powers[HYDRA_POWER] == 10)
      send_to_char("#0Power     #0[#G**********#0]#n\n\r",ch);

  if (ch->pcdata->powers[HYDRA_MAGIC] == 0)
      send_to_char("#0Magic     #0[#R**********#0]#n\n\r",ch);
  if (ch->pcdata->powers[HYDRA_MAGIC] == 1)
      send_to_char("#0Magic     #0[#G*#R*********#0]#n\n\r",ch);
  if (ch->pcdata->powers[HYDRA_MAGIC] == 2)
      send_to_char("#0Magic     #0[#G**#R********#0]#n\n\r",ch);
  if (ch->pcdata->powers[HYDRA_MAGIC] == 3)
      send_to_char("#0Magic     #0[#G***#R*******#0]#n\n\r",ch);
  if (ch->pcdata->powers[HYDRA_MAGIC] == 4)
      send_to_char("#0Magic     #0[#G****#R******#0]#n\n\r",ch);
  if (ch->pcdata->powers[HYDRA_MAGIC] == 5)
      send_to_char("#0Magic     #0[#G*****#R*****#0]#n\n\r",ch);
  if (ch->pcdata->powers[HYDRA_MAGIC] == 6)
      send_to_char("#0Magic     #0[#G******#R****#0]#n\n\r",ch);
  if (ch->pcdata->powers[HYDRA_MAGIC] == 7)
      send_to_char("#0Magic     #0[#G*******#R***#0]#n\n\r",ch);
  if (ch->pcdata->powers[HYDRA_MAGIC] == 8)
      send_to_char("#0Magic     #0[#G********#R**#0]#n\n\r",ch);
  if (ch->pcdata->powers[HYDRA_MAGIC] == 9)
      send_to_char("#0Magic     #0[#G*********#R*#0]#n\n\r",ch);
  if (ch->pcdata->powers[HYDRA_MAGIC] == 10)
      send_to_char("#0Magic     #0[#G**********#0]#n\n\r",ch);

  if (ch->pcdata->powers[HYDRA_ATTACK] == 0)
      send_to_char("#0Attack    #0[#R**********#0]#n\n\r",ch);
  if (ch->pcdata->powers[HYDRA_ATTACK] == 1)
      send_to_char("#0Attack    #0[#G*#R*********#0]#n\n\r",ch);
  if (ch->pcdata->powers[HYDRA_ATTACK] == 2)
      send_to_char("#0Attack    #0[#G**#R********#0]#n\n\r",ch);
  if (ch->pcdata->powers[HYDRA_ATTACK] == 3)
      send_to_char("#0Attack    #0[#G***#R*******#0]#n\n\r",ch);
  if (ch->pcdata->powers[HYDRA_ATTACK] == 4)
      send_to_char("#0Attack    #0[#G****#R******#0]#n\n\r",ch);
  if (ch->pcdata->powers[HYDRA_ATTACK] == 5)
      send_to_char("#0Attack    #0[#G*****#R*****#0]#n\n\r",ch);
  if (ch->pcdata->powers[HYDRA_ATTACK] == 6)
      send_to_char("#0Attack    #0[#G******#R****#0]#n\n\r",ch);
  if (ch->pcdata->powers[HYDRA_ATTACK] == 7)
      send_to_char("#0Attack    #0[#G*******#R***#0]#n\n\r",ch);
  if (ch->pcdata->powers[HYDRA_ATTACK] == 8)
      send_to_char("#0Attack    #0[#G********#R**#0]#n\n\r",ch);
  if (ch->pcdata->powers[HYDRA_ATTACK] == 9)
      send_to_char("#0Attack    #0[#G*********#R*#0]#n\n\r",ch);
  if (ch->pcdata->powers[HYDRA_ATTACK] == 10)
      send_to_char("#0Attack    #0[#G**********#0]#n\n\r",ch);

  if (ch->pcdata->powers[HYDRA_DEFENSE] == 0)
      send_to_char("#0Defense   #0[#R**********#0]#n\n\r",ch);
  if (ch->pcdata->powers[HYDRA_DEFENSE] == 1)
      send_to_char("#0Defense   #0[#G*#R*********#0]#n\n\r",ch);
  if (ch->pcdata->powers[HYDRA_DEFENSE] == 2)
      send_to_char("#0Defense   #0[#G**#R********#0]#n\n\r",ch);
  if (ch->pcdata->powers[HYDRA_DEFENSE] == 3)
      send_to_char("#0Defense   #0[#G***#R*******#0]#n\n\r",ch);
  if (ch->pcdata->powers[HYDRA_DEFENSE] == 4)
      send_to_char("#0Defense   #0[#G****#R******#0]#n\n\r",ch);
  if (ch->pcdata->powers[HYDRA_DEFENSE] == 5)
      send_to_char("#0Defense   #0[#G*****#R*****#0]#n\n\r",ch);
  if (ch->pcdata->powers[HYDRA_DEFENSE] == 6)
      send_to_char("#0Defense   #0[#G******#R****#0]#n\n\r",ch);
  if (ch->pcdata->powers[HYDRA_DEFENSE] == 7)
      send_to_char("#0Defense   #0[#G*******#R***#0]#n\n\r",ch);
  if (ch->pcdata->powers[HYDRA_DEFENSE] == 8)
      send_to_char("#0Defense   #0[#G********#R**#0]#n\n\r",ch);
  if (ch->pcdata->powers[HYDRA_DEFENSE] == 9)
      send_to_char("#0Defense   #0[#G*********#R*#0]#n\n\r",ch);
  if (ch->pcdata->powers[HYDRA_DEFENSE] == 10)
      send_to_char("#0Defense   #0[#G**********#0]#n\n\r",ch);

    send_to_char("Choose a Hydra Power to Increase: Power, Magic, Attack, Defense.\n\r",ch);
    return;
  }
  if (!str_cmp(arg,"power"))  
  {
    if (ch->pcdata->powers[HYDRA_POWER]>9)
    {
      send_to_char("You Have Full Power.\n\r",ch);
      return;
    }
    else if (ch->practice < ch->pcdata->powers[HYDRA_POWER] * 60 + 60)
    {
      send_to_char("You are not ready to increase your power.\n\r",ch);
      return;
    }
    else
    {
      ch->practice -= ch->pcdata->powers[HYDRA_POWER] * 60 + 60;
      send_to_char("You have become more powerful.\n\r",ch);
      ch->pcdata->powers[HYDRA_POWER] += 1;
      return;
    }
  }
  else if (!str_cmp(arg,"magic"))  
  {
    if (ch->pcdata->powers[HYDRA_MAGIC]>9)
    {
      send_to_char("You are already a master of the Arcane.\n\r",ch);
      return;
    }
    else if (ch->practice < ch->pcdata->powers[HYDRA_MAGIC] * 60 + 60)
    {
      send_to_char("You are not ready to learn more of the Arcane.\n\r",ch);
      return;
    }
    else
    {
      ch->practice -= ch->pcdata->powers[HYDRA_MAGIC] * 60 + 60;
      send_to_char("Your mastery of the ancient arts increase.\n\r",ch);
      ch->pcdata->powers[HYDRA_MAGIC] += 1;
      return;
    }
  }
  else if (!str_cmp(arg,"attack"))  
  {
    if (ch->pcdata->powers[HYDRA_ATTACK] > 9)
    {
      send_to_char("You have mastered Attack.\n\r",ch);
      return;
    }
    if (ch->practice < ch->pcdata->powers[HYDRA_ATTACK] * 60 + 60)
    {
      send_to_char("You may not learn more of Melee yet.\n\r",ch);
      return;
    }
    else  
    {
      ch->practice -= ch->pcdata->powers[HYDRA_ATTACK] * 60 + 60;
      send_to_char("Knowledge flows into you and you gain a better understanding of Combat.\n\r",ch);
      ch->pcdata->powers[HYDRA_ATTACK] += 1;
      return;
    }
  }
  else if (!str_cmp(arg,"defense")) 
  {
    if (ch->pcdata->powers[HYDRA_DEFENSE] > 9)
    {
      send_to_char("You have Mastered the art of Defense.\n\r",ch);
      return;
    }
    if (ch->practice < ch->pcdata->powers[HYDRA_DEFENSE] * 60 + 60)
    {
      send_to_char("You can not learn more of Defense yet.\n\r",ch);
      return;
    }
    else  
    {
      ch->practice -= ch->pcdata->powers[HYDRA_DEFENSE] * 60 + 60;
      send_to_char("You Learn more of Defense.\n\r",ch);
      ch->pcdata->powers[HYDRA_DEFENSE] += 1;
      return;
    }
  }
  return;
}

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

  if (IS_NPC(ch)) return;
    if (!IS_CLASS(ch, CLASS_HYDRA) && !IS_CLASS(ch, CLASS_TYPHON)
    && !IS_CLASS(ch, CLASS_NAZGUL) && !IS_CLASS(ch, CLASS_BAATEZU))

  {
    send_to_char("Only Hydras may grow more heads.\n\r",ch);
    return;
  }
  if (ch->pcdata->powers[HYDRA_HEADS] > 17)
  {
    send_to_char("You Already Have 18 Heads.\n\r",ch);
    return;
  }
  if (ch->practice < ch->pcdata->powers[HYDRA_HEADS]*60 + 60)
  {
    send_to_char("You are not ready to grow another head.\n\r",ch);
    return;
  }
  else  
  {
    ch->practice -= ch->pcdata->powers[HYDRA_HEADS]*60 + 60;
    send_to_char("A stump begins growing from your body, it forms into a neck, then a head slowly grows.\n\r",ch);
//    sprintf(buf,"%s the #C***#yHydra#C***#n has Grown another Head.\n\r",ch->pcdata->switchname);
//    do_info(ch,buf);
    ch->pcdata->powers[HYDRA_HEADS] += 1;
    return;
  }
}


void do_stomp( CHAR_DATA *ch, char *argument )
{
  CHAR_DATA *victim;
  OBJ_DATA *obj;
  int limb;

  if (IS_NPC(ch)) return;
    if (!IS_CLASS(ch, CLASS_HYDRA) && !IS_CLASS(ch, CLASS_TYPHON)
    && !IS_CLASS(ch, CLASS_NAZGUL) && !IS_CLASS(ch, CLASS_BAATEZU))

  {
    send_to_char("What?\n\r",ch);
    return;
  }
  if (ch->pcdata->powers[HYDRA_ATTACK] < 5)
  {
    send_to_char("You Need To get Your Attack Higher.\n\r",ch);
    return;
  }
  if (( victim = ch->fighting ) == NULL )
  {
    send_to_char( "You aren't fighting anyone.\n\r", ch );
    return;
  }
  act("You throw $N to the ground and tramples $S to a bloody pulp.",ch,NULL,victim,TO_CHAR);
  act("$n throws you to the ground and #RSTOMPS#n on you.",ch,NULL,victim,TO_VICT);
  act("$n throws $N to the ground and tramples $S to a bloody pulp.",ch,NULL,victim,TO_NOTVICT);
  hurt_person(ch,victim,500);
  limb = number_range(1,4);
  if (number_range(1,100) > 60 && !IS_NPC(victim)) {
  if (limb < 3)
  {
    if (!IS_ARM_R(victim,LOST_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);
    if (IS_BLEEDING(victim,BLEEDING_ELBOW_R))   REMOVE_BIT(victim->loc_hp[6],BLEEDING_ELBOW_R);
    if ((obj = get_eq_char( victim, WEAR_ARMS )) != NULL)     take_item(victim,obj);
    if ((obj = get_eq_char( victim, WEAR_WIELD )) != NULL)    take_item(victim,obj);
    if ((obj = get_eq_char( victim, WEAR_HANDS )) != NULL)    take_item(victim,obj);
    if ((obj = get_eq_char( victim, WEAR_WRIST_R )) != NULL)  take_item(victim,obj);
    if ((obj = get_eq_char( victim, WEAR_FINGER_R )) != NULL) take_item(victim,obj);
  }
  else
  {
    if (!IS_ARM_L(victim,LOST_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);
    if (IS_BLEEDING(victim,BLEEDING_ELBOW_L))   REMOVE_BIT(victim->loc_hp[6],BLEEDING_ELBOW_L);
    if ((obj = get_eq_char( victim, WEAR_ARMS )) != NULL)     take_item(victim,obj);
    if ((obj = get_eq_char( victim, WEAR_HOLD )) != NULL)     take_item(victim,obj);
    if ((obj = get_eq_char( victim, WEAR_HANDS )) != NULL)    take_item(victim,obj);
    if ((obj = get_eq_char( victim, WEAR_WRIST_L )) != NULL)  take_item(victim,obj);
    if ((obj = get_eq_char( victim, WEAR_FINGER_L )) != NULL) take_item(victim,obj);
  }
  }
  WAIT_STATE(ch,24);
  return;
}

void do_breath( CHAR_DATA *ch, char *argument )
{
  CHAR_DATA *victim;
  int sn;
  int level = 40;

  if (IS_NPC(ch)) return;
    if (!IS_CLASS(ch, CLASS_HYDRA) && !IS_CLASS(ch, CLASS_TYPHON)
    && !IS_CLASS(ch, CLASS_NAZGUL) && !IS_CLASS(ch, CLASS_BAATEZU))

  {
    send_to_char("What?\n\r",ch);
    return;
  }
  if (( victim = ch->fighting ) == NULL )
  {
    send_to_char( "You aren't fighting anyone.\n\r", ch );
    return;
  }  
  if (!((sn = skill_lookup( "fire breath" )) > 0)) return;
  (*skill_table[sn].spell_fun) (sn,level,ch,victim);
  if (ch->pcdata->powers[HYDRA_LEVEL] > 0) (*skill_table[sn].spell_fun) (sn,level,ch,victim);
  if (ch->pcdata->powers[HYDRA_LEVEL] > 1) (*skill_table[sn].spell_fun) (sn,level,ch,victim);
  if (ch->pcdata->powers[HYDRA_LEVEL] > 3) (*skill_table[sn].spell_fun) (sn,level,ch,victim);
  if (ch->pcdata->powers[HYDRA_LEVEL] > 4) (*skill_table[sn].spell_fun) (sn,level,ch,victim);
  WAIT_STATE(ch, 24);
  return;
}
void do_mistwalk(CHAR_DATA *ch, char *argument)
{
  char arg[MAX_INPUT_LENGTH];
  ROOM_INDEX_DATA *location;
  CHAR_DATA *victim;

  one_argument (argument, arg);
  if (IS_NPC(ch)) return;
    if (!IS_CLASS(ch, CLASS_HYDRA) && !IS_CLASS(ch, CLASS_TYPHON)
    && !IS_CLASS(ch, CLASS_NAZGUL) && !IS_CLASS(ch, CLASS_BAATEZU))

  {
    send_to_char("Huh?\n\r", ch );
    return;
  }
  if (ch->pcdata->powers[HYDRA_POWER] < 2)
  {
    send_to_char("You need level 2 Hydra Power.\n\r",ch);
    return;
  }
  if ((victim = get_char_world(ch, arg)) == NULL)
  {
    send_to_char("Mistwalk to whom?\n\r", ch );
    return;
  }
  if( IS_SET(victim->in_room->room_flags, ROOM_ASTRAL))
  {
    stc( "You can't find it's room.\n\r",ch);
    return;
  }
  if (IS_IMMUNE(victim, IMM_TRAVEL) && !IS_NPC(victim))
  {
    send_to_char("I don't think they want you to do that.\n\r",ch);
    return;
  }
  if (IS_SET(ch->in_room->room_flags, ROOM_ASTRAL))
  {
    stc( "Your room is not connected to the astral plane.\n\r",ch);
    return;
  }
  location = victim->in_room;
  if (ch->move < 250)
  {
    send_to_char("You are too tired to reform into mist.\n\r", ch );
    return;
  }
  act("You reform into thin mist and seep into the floor.", ch, NULL, NULL, TO_CHAR);
  act("$n reforms into thin mist and seeps into the floor.", ch, NULL, NULL, TO_ROOM);
  ch->move -= 250;
  char_from_room(ch);
  char_to_room(ch, location);
  do_look(ch, "auto");
  act("You seep up from the floor and reform into your body.", ch, NULL, NULL, TO_CHAR);
  act("A fine mist seeps up from the floor and reforms into $n.", ch, NULL, NULL, TO_ROOM);
  return;
}

void do_shaperoar (CHAR_DATA *ch, char *argument)
{
  CHAR_DATA *victim;

  if (IS_NPC(ch)) return;
    if (!IS_CLASS(ch, CLASS_HYDRA) && !IS_CLASS(ch, CLASS_TYPHON)
    && !IS_CLASS(ch, CLASS_NAZGUL) && !IS_CLASS(ch, CLASS_BAATEZU))

  {
    if (IS_CLASS(ch, CLASS_WEREWOLF) || IS_CLASS(ch, CLASS_UNDEAD_LYCAN)) do_roar(ch,argument);
    else send_to_char("Huh?\n\r",ch);
    return;
  }
  if (ch->pcdata->powers[HYDRA_DEFENSE] < 3)
  {
    send_to_char("Your Hydra Defense isnt high enough.\n\r",ch);
    return;
  }
  if ( ch->fighting == NULL )
  {
    send_to_char("You must be fighting to #RROAR!!!!#n.\n\r",ch);
    return;
  }
  if ( (victim = ch->fighting) == NULL ) return;
  WAIT_STATE( ch, 16 );
  if ( number_range( 1, 2 ) != 1 )
  {
    act("You let out an insane BeeF-powered #RROAR!!!!!!!!!#n to scare the shit out of $N, but it doesn't work.",ch,NULL,victim,TO_CHAR);
    act("$n lets out an insane BeeF-powered #RROAR!!!!!!!!!#n, but it doesn't scare you.",ch,NULL,victim,TO_VICT);
    act("$n lets out an insane BeeF-powered #RROAR!!!!!!!!!#n",ch,NULL,victim,TO_NOTVICT);
    return;
  }
  act("You let out an insane BeeF-powered #RROAR!!!!!!!!!#n and scare the shit out of $N.",ch,NULL,victim,TO_CHAR);
  act("$n lets out an insane BeeF-powered #RROAR!!!!!!!!!#n, and you are filled with terror.",ch,NULL,victim,TO_VICT);
  act("$n lets out an insane BeeF-powered #RROAR!!!!!!!!!#n",ch,NULL,victim,TO_NOTVICT);
  do_flee( victim, "" );
  return;
}


void do_charge(CHAR_DATA *ch, char *argument)
{
  CHAR_DATA *victim;
   
  if (IS_NPC(ch)) return;
    if (!IS_CLASS(ch, CLASS_HYDRA) && !IS_CLASS(ch, CLASS_TYPHON)
    && !IS_CLASS(ch, CLASS_NAZGUL) && !IS_CLASS(ch, CLASS_BAATEZU))

  {
    send_to_char("Huh?\n\r",ch);
    return;
  }
  if (ch->pcdata->powers[HYDRA_ATTACK] < 4)
  {
    send_to_char("Your Skill with Attack isnt good enough.\n\r",ch);
    return;
  }
  if (ch->move < 2000)
  {
    send_to_char("This costs 2000 move.\n\r",ch);
    return;
  }
  if ( ( victim = ch->fighting ) == NULL )
  { 
    send_to_char( "You aren't fighting anyone.\n\r", ch );
    return;
  }
  WAIT_STATE(ch, 18);
  ch->move -= 2000;
  one_hit(ch,victim,gsn_headbutt,1);
  one_hit(ch,victim,gsn_hooves,1);
  one_hit(ch,victim,gsn_hooves,1);
  one_hit(ch,victim,gsn_hooves,1);
  if (number_range(1,3)==1)
  {
    victim->position = POS_STUNNED;
    ch->position = POS_STANDING;
    act("You lift $N up by the horns and sends $M flying into the wall.",ch,NULL,victim,TO_CHAR);
    act("$n lifts you up by the horns and send you flying into the wall.",ch,NULL,victim, TO_VICT);
    act("$n lifts $N up by the horns and sends $M flying into the wall.",ch,NULL,victim, TO_ROOM);
  }
  return;
}

void do_deathaura( CHAR_DATA *ch, char *argument )
{
  if (IS_NPC(ch)) return;
    if (!IS_CLASS(ch, CLASS_HYDRA) && !IS_CLASS(ch, CLASS_TYPHON)
    && !IS_CLASS(ch, CLASS_NAZGUL) && !IS_CLASS(ch, CLASS_BAATEZU))
  {
    send_to_char("Huh?\n\r",ch);
    return;
  }
  if (ch->pcdata->powers[HYDRA_MAGIC] < 3)
  {
    send_to_char("You need your Magic to 3 for this.\n\r",ch);
    return;
  }
    if (IS_SET(ch->pcdata->powers[AURAS], DEATH_AURA))
    {
      REMOVE_BIT(ch->pcdata->powers[AURAS], DEATH_AURA);
    act("Your Death Aura dicipates.", ch, NULL, NULL, TO_CHAR);
    act("$n loses their Death Aura.", ch, NULL, NULL, TO_ROOM);
    return;
  }
  SET_BIT(ch->pcdata->powers[AURAS], DEATH_AURA);
  act("An Aura of Death seeps through your Scales..", ch, NULL, NULL, TO_CHAR);
  act("An Aura of DEATH seeps through $n's Scales .", ch, NULL, NULL, TO_ROOM);
  return;
}