#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <assert.h>
#include <unistd.h>
#include <string.h>
#include "merc.h"


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

        one_argument(argument, arg);

        if (IS_NPC(ch))
                return;

        if (!IS_RACE(ch, RACE_MINOTAUR))
        {
                send_to_char("#0This is a Minotaur Ability#n\n\r", ch);
                return;
        }

        if (arg[0] == '\0')
        {
                send_to_char("Gore 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 (victim == ch)
        {
                send_to_char("#0No goring yourself#n\n\r", ch);
                return;
        }


        if (IS_NPC(victim))
        {
         
                send_to_char
                        ("#cYou materialize in front of your opponent and #Rgore him with your sharp horns!#n\n\r",
                         ch);
                act("#G$n #cmaterializes out of thin air, screaming wildly, and #Rgores $s opponent with $s razor sharp horns!!#n", ch, NULL, NULL, TO_ROOM);
                ch->move -= 10000;
                WAIT_STATE(ch, 3 * PULSE_VIOLENCE);
                multi_hit(ch, victim, TYPE_UNDEFINED);
                multi_hit(ch, victim, TYPE_UNDEFINED);
                multi_hit(ch, victim, TYPE_UNDEFINED);
                multi_hit(ch, victim, TYPE_UNDEFINED);
                multi_hit(ch, victim, TYPE_UNDEFINED);
                return;
        }

        send_to_char
                ("#cYou materialize in front of your opponent and #Rgore him with your sharp horns#n\n\r",
                 ch);
        act("#G$n #cmaterializes out of thin air, screaming wildly, and #Rgores you with $s razor sharp horns!!#n", ch, NULL, NULL, TO_VICT);
        ch->move -= 10000;
        WAIT_STATE(ch, 3 * PULSE_VIOLENCE);
        multi_hit(ch, victim, TYPE_UNDEFINED);
        if (number_percent() > 85)
                multi_hit(ch, victim, TYPE_UNDEFINED);
        if (number_percent() > 95)
                multi_hit(ch, victim, TYPE_UNDEFINED);
        return;
}


void do_jawlock(CHAR_DATA *ch,char *argument)
{
  if (IS_NPC(ch)) return;
  if (!IS_RACE(ch, RACE_GNOLL))
  {
  send_to_char("Huh?\n\r",ch);
  return;
  }
  if (!IS_SET(ch->newbits, NEW_JAWLOCK))
  {
  send_to_char("Your jaw grows stronger and more ready to clamp on your enemy.\n\r",ch);
  SET_BIT(ch->newbits, NEW_JAWLOCK);
  return;
  }
  else if (IS_SET(ch->newbits, NEW_JAWLOCK))
  { 
  send_to_char("Your jaw weakens.\n\r",ch);
  REMOVE_BIT(ch->newbits,NEW_JAWLOCK);
  return;
  }
return;
}



/* Syntax : chant <type> <color> <target>
 * ex. chant bless red self 
 */
void do_chant (CHAR_DATA *ch, char *argument)
{
  char arg1[MAX_STRING_LENGTH];
  char arg2[MAX_STRING_LENGTH];
  char buf1[MAX_STRING_LENGTH];
  char buf2[MAX_STRING_LENGTH];
  char buf3[MAX_STRING_LENGTH];
  CHAR_DATA *victim;
  AFFECT_DATA af;
  int i, dam, count, sn;
  int red_magic = ch->spl[RED_MAGIC];
  int blue_magic = ch->spl[BLUE_MAGIC];
  int green_magic = ch->spl[GREEN_MAGIC];
  int purple_magic = ch->spl[PURPLE_MAGIC];
  int yellow_magic = ch->spl[YELLOW_MAGIC];
  int magic_power = ch->spl[RED_MAGIC] + ch->spl[BLUE_MAGIC] + ch->spl[GREEN_MAGIC] + ch->spl[PURPLE_MAGIC] + ch->spl[YELLOW_MAGIC];
    
  argument=one_argument(argument,arg1);
  strcpy(arg2,argument);

  if (IS_NPC(ch)) return;

  if (!IS_RACE(ch, RACE_OGREMAGE))
  {
    send_to_char("#0Chant is an Ogre-Mage Ability#n\n\r",ch);
    return;
  }
  if (arg1[0] == '\0')
  {  
    send_to_char("Syntax : chant <bless/curse/damage/heal> <target>.\n\r", ch);
    return;
  }  
  if (!str_cmp(arg1, "heal"))
  {
    if (arg2[0] == '\0') victim = ch;
    else if ((victim = get_char_room(ch, arg2)) == NULL)
    {
      send_to_char("They are not here.\n\r", ch );
      return;
    }
    if (ch->mana < 1500)
    {
      send_to_char("You need 1500 mana.\n\r",ch);
      return;
    }    
    act("$n channels lifeforce from the five elements into $N.",ch,NULL,victim,TO_NOTVICT);
    act("You channel lifeforce from the five elements into $N.",ch,NULL,victim,TO_CHAR);
    act("$n channels lifeforce from the five elements into you.",ch,NULL,victim,TO_VICT);
    WAIT_STATE(ch,8);
    ch->mana -= 1500;
    victim->hit = UMIN(victim->hit + (magic_power * 1.5), victim->max_hit);
    return;
  }
  else if (!str_cmp(arg1, "damage"))
  {
    if (arg2[0] == '\0' && ch->fighting != NULL) victim = ch->fighting;
    else if ((victim = get_char_room(ch, arg2)) == NULL)
    {
      send_to_char("They are not here.\n\r", ch );
      return;
    }
    if (ch->mana <1000)
    {
      send_to_char("You need 1000 mana.\n\r",ch);
      return;
    }
    if (victim == ch)
    {
      send_to_char("You really don't want to hurt yourself.\n\r", ch );
      return;
    }
    if (is_safe(ch, victim)) return;
    if (victim->position == POS_DEAD || ch->in_room != victim->in_room)
      return;
    if (IS_AFFECTED(ch, AFF_PEACE)) REMOVE_BIT(ch->affected_by, AFF_PEACE);
    if (victim->position > POS_STUNNED)
    {
      if (victim->fighting == NULL) set_fighting(victim, ch);
      if (ch->fighting == NULL) set_fighting(ch, victim);
    }
    WAIT_STATE(ch,8);
    ch->mana -= 1000;
    dam = number_range(red_magic*4, red_magic*5);
    dam += char_damroll(ch);
    dam = cap_dam(ch,victim,dam);
    if (!IS_NPC(victim))
    {
//      if (IS_CLASS(ch, CLASS_MAGE) && dam > 600) dam = number_range(580,620);
      if (dam > 1000) dam = number_range(950,1050);
    }
    sprintf(buf1,"$n calls for the forces of #Rhell#n to destroy $N [#C%d#n]" , dam);
    sprintf(buf2,"You call for the forces of #Rhell#n to destroy $N [#C%d#n]" , dam);
    sprintf(buf3,"$n calls for the forces of #Rhell#n to destroy you [#C%d#n]" , dam);
    act(buf1,ch,NULL,victim, TO_NOTVICT);
    act(buf2,ch,NULL,victim, TO_CHAR);
    act(buf3,ch,NULL,victim, TO_VICT);
    hurt_person(ch, victim, dam);
    if (victim->position == POS_DEAD || ch->in_room != victim->in_room) return;
    dam = number_range(blue_magic*4, blue_magic*5);
    dam += char_damroll(ch);
    dam = cap_dam(ch,victim,dam);
    if (!IS_NPC(victim))
    {
//      if (IS_CLASS(ch, CLASS_MAGE) && dam > 600) dam = number_range(580,620);
      if (dam > 1000) dam = number_range(950,1050);
    }
    sprintf(buf1,"$n summons a supernatural #Lstorm#n to strike $N with lightning [#C%d#n]" , dam);
    sprintf(buf2,"You summon a supernatural #Lstorm#n to strike $N with lightning [#C%d#n]" , dam);
    sprintf(buf3,"$n summons a supernatural #Lstorm#n to strike you with lightning [#C%d#n]" , dam);
    act(buf1,ch,NULL,victim, TO_NOTVICT);
    act(buf2,ch,NULL,victim, TO_CHAR);
    act(buf3,ch,NULL,victim, TO_VICT);
    hurt_person(ch, victim, dam);
    if (victim->position == POS_DEAD || ch->in_room != victim->in_room) return;
    dam = number_range(green_magic*4, green_magic*5);
    dam += char_damroll(ch);
    dam = cap_dam(ch,victim,dam);
    if (!IS_NPC(victim))
    {
//      if (IS_CLASS(ch, CLASS_MAGE) && dam > 600) dam = number_range(580,620);
      if (dam > 1000) dam = number_range(950,1050);
    }
    sprintf(buf1,"$n calls for #Gthorns#n to grow from the earth and pierce $N [#C%d#n]" , dam);
    sprintf(buf2,"You call for #Gthorns#n to grow from the earth and pierce $N [#C%d#n]" , dam);
    sprintf(buf3,"$n calls for #Gthorns#n to grow from the earth and pierce You [#C%d#n]" , dam);
    act(buf1,ch,NULL,victim, TO_NOTVICT);
    act(buf2,ch,NULL,victim, TO_CHAR);
    act(buf3,ch,NULL,victim, TO_VICT);
    hurt_person(ch, victim, dam);
    if (victim->position == POS_DEAD || ch->in_room != victim->in_room) return;
    dam = number_range(purple_magic*4, purple_magic*5);
    dam += char_damroll(ch);
    dam = cap_dam(ch,victim,dam);
    if (!IS_NPC(victim))
    {
//      if (IS_CLASS(ch, CLASS_MAGE) && dam > 600) dam = number_range(580,620);
      if (dam > 1000) dam = number_range(950,1050);
    }
    sprintf(buf1,"$n calls on the powers of the #punderdark#n to shatter $N's bones [#C%d#n]" , dam);
    sprintf(buf2,"You call on the powers of the #punderdark#n to shatter $N's bones [#C%d#n]" , dam);
    sprintf(buf3,"$n calls on the powers of the #punderdark#n to shatter your bones [#C%d#n]" , dam);
    act(buf1,ch,NULL,victim, TO_NOTVICT);
    act(buf2,ch,NULL,victim, TO_CHAR);
    act(buf3,ch,NULL,victim, TO_VICT);
    hurt_person(ch, victim, dam);
    if (victim->position == POS_DEAD || ch->in_room != victim->in_room) return;
    dam = number_range(yellow_magic*4, yellow_magic*5);
    dam += char_damroll(ch);
    dam = cap_dam(ch,victim,dam);
    if (!IS_NPC(victim))
    {
//      if (IS_CLASS(ch, CLASS_MAGE) && dam > 600) dam = number_range(580,620);
      if (dam > 1000) dam = number_range(950,1050);
    }
    sprintf(buf1,"$n spews forth a shower of #yacid#n striking $N [#C%d#n]" , dam);
    sprintf(buf2,"you spew forth a shower of #yacid#n striking $N [#C%d#n]" , dam);
    sprintf(buf3,"$n spews forth a shower of #yacid#n striking you [#C%d#n]" , dam);
    act(buf1,ch,NULL,victim, TO_NOTVICT);
    act(buf2,ch,NULL,victim, TO_CHAR);
    act(buf3,ch,NULL,victim, TO_VICT);
    hurt_person(ch, victim, dam);
    return;
  }
  else if (!str_cmp(arg1, "bless"))
  {
    if ((victim = get_char_room(ch, arg2)) == NULL)
    {
      send_to_char("They are not here.\n\r", ch );
      return;
    }
    if (ch->mana <2500)
    {
      send_to_char("You need 2500 mana.\n\r",ch);
      return;
    }
    if (victim->position == POS_DEAD || ch->in_room != victim->in_room)
      return;
    count = 0;
    for (i = 0; i<5 ; i++)
    {
      if (i==0) {sn = skill_lookup("purple sorcery");dam=purple_magic;}
      if (i==1) {sn = skill_lookup("yellow sorcery");dam=yellow_magic;}
      if (i==2) {sn = skill_lookup("green sorcery");dam=green_magic;}
      if (i==3) {sn = skill_lookup("red sorcery");dam=red_magic;}
      if (i==4) {sn = skill_lookup("blue sorcery");dam=blue_magic;}
      if (is_affected(victim, sn))
        continue;
      
      count++;
      
      af.type      = sn;
      af.duration  = dam/4;
      af.location  = APPLY_HIT;
      af.modifier  = dam*2;
      af.bitvector = 0;
      affect_to_char(victim, &af);
      af.type      = sn;
      af.duration  = dam/4;
      af.location  = APPLY_AC;
      af.modifier  = -dam/2;
      af.bitvector = 0;
      affect_to_char(victim, &af);
      af.type      = sn;
      af.duration  = dam/4;
      af.location  = APPLY_MOVE;
      af.modifier  = dam*2;
      af.bitvector = 0;
      affect_to_char(victim, &af);
      af.type      = sn;
      af.duration  = dam/4;
      af.location  = APPLY_MANA;
      af.modifier  = dam*2;
      af.bitvector = 0;
      affect_to_char(victim, &af);
      af.type      = sn;
      af.duration  = dam/4;
      af.location  = APPLY_HITROLL;
      af.modifier  = dam/3;
      af.bitvector = 0;
      affect_to_char(victim, &af);
      af.type      = sn;
      af.duration  = dam/4;
      af.location  = APPLY_DAMROLL;
      af.modifier  = dam/3;
      af.bitvector = 0;
      affect_to_char(victim, &af);
    }
    ch->mana -= count * 500;
    WAIT_STATE(ch,6);
    sprintf(buf1, "You bless $N with the power of the elements.");
    sprintf(buf2, "The power of the five elements fills your body.");
    act(buf1, ch, NULL, victim, TO_CHAR);
    act(buf2, ch, NULL, victim, TO_VICT);
    return;
  }
  else if (!str_cmp(arg1, "curse"))
  {
    if ((victim = get_char_room(ch, arg2)) == NULL)
    {
      send_to_char("They are not here.\n\r", ch );
      return;
    }
    if (ch->mana <2500)
    {
      send_to_char("You need 2500 mana.\n\r",ch);
      return;
    }
    if (victim->level < 3)
    {
      send_to_char("Not on mortal, thier bodies cant handles the strain....poor little buggers.\n\r",ch);
      return;
    }
    if (victim->position == POS_DEAD || ch->in_room != victim->in_room)
      return;
    count = 0;
    for (i = 0;i<5;i++)
    {
      if (i==0) {sn = skill_lookup("purple sorcery");dam=purple_magic;}
      if (i==1) {sn = skill_lookup("yellow sorcery");dam=yellow_magic;}
      if (i==2) {sn = skill_lookup("green sorcery");dam=green_magic;}
      if (i==3) {sn = skill_lookup("red sorcery");dam=red_magic;}
      if (i==4) {sn = skill_lookup("blue sorcery");dam=blue_magic;}
      if (is_affected(victim, sn))
        continue;
      
      count++;

      af.type      = sn;
      af.duration  = dam/4;
      af.location  = APPLY_HIT;
      af.modifier  = -dam*2;
      af.bitvector = 0;
      affect_to_char(victim, &af);
      af.type      = sn;
      af.duration  = dam/4;
      af.location  = APPLY_AC;
      af.modifier  = dam/2;
      af.bitvector = 0;
      affect_to_char(victim, &af);
      af.type      = sn;
      af.duration  = dam/4;
      af.location  = APPLY_MOVE;
      af.modifier  = -dam*2;
      af.bitvector = 0;
      affect_to_char(victim, &af);
      af.type      = sn;
      af.duration  = dam/4;
      af.location  = APPLY_MANA;
      af.modifier  = -dam*2;
      af.bitvector = 0;
      affect_to_char(victim, &af);
      af.type      = sn;
      af.duration  = dam/4;
      af.location  = APPLY_HITROLL;
      af.modifier  = -dam/3;
      af.bitvector = 0;
      affect_to_char(victim, &af);
      af.type      = sn;
      af.duration  = dam/4;
      af.location  = APPLY_DAMROLL;
      af.modifier  = -dam/3;
      af.bitvector = 0;
      affect_to_char(victim, &af);
    }
    ch->mana -= count * 500;
    WAIT_STATE(ch,6);
    sprintf(buf1, "You curse $N with the power of the elements.");
    sprintf(buf2, "The power of the five elements wrecks your body.");
    act(buf1, ch, NULL, victim, TO_CHAR);
    act(buf2, ch, NULL, victim, TO_VICT);
    return;      
  }
  send_to_char("Syntax : chant <bless/curse/damage/heal> <target>.\n\r", ch);
  return;
}

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

        argument = one_argument(argument, arg);

        if (IS_NPC(ch))
                return;

        if (!IS_RACE(ch, RACE_MTDWARF) && !IS_RACE(ch, RACE_GULLYDWARF)
	  && !IS_RACE(ch, RACE_HILLDWARF) && !IS_RACE(ch, RACE_AQUATICDWARF)
	  && !IS_RACE(ch, RACE_ARCTICDWARF) && !IS_RACE(ch, RACE_DEEPDWARF)
	  && !IS_RACE(ch, RACE_DESERTDWARF) && !IS_RACE(ch, RACE_DREAMDWARF)
	  && !IS_RACE(ch, RACE_EARTHDWARF) && !IS_RACE(ch, RACE_GOLDDWARF) 
	  && !IS_RACE(ch, RACE_GREYDWARF) && !IS_RACE(ch, RACE_JUNGLEDWARF)
	  && !IS_RACE(ch, RACE_DUERGARDWARF))
        {
                send_to_char("#0This is a Dwarf Ability.#n\n\r", ch);
                return;
        }

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

        if (IS_SET(ch->in_room->room_flags, ROOM_ASTRAL))
        {
                stc("#0Your room is not connected to the astral plane.#n\n\r", ch);
                return;
        }

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

        if (IS_IMMUNE(victim, IMM_TRAVEL))
        {
                send_to_char("#0They are immune to travel.#n\n\r", ch);
                return;
        }

        if (IS_SET(victim->act, ACT_NOTRAVEL))
        {
                send_to_char("#0No Can Do.#n\n\r", ch);
                return;
        }

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

        if (victim->in_room == NULL)
        {
                send_to_char("#0Nothing happens.#n\n\r", ch);
                return;
        }
        if (IS_SET(victim->in_room->room_flags, ROOM_ASTRAL))
        {
                stc("#0Their room is not connected to the astral plane.#n\n\r", ch);
                return;
        }

        send_to_char("#0You tunnel into the ground.#n\n\r", ch);
        act("$n #0tunnels into the ground.#n", ch, NULL, NULL, TO_ROOM);
        char_from_room(ch);
        char_to_room(ch, victim->in_room);
        do_look(ch, "");
        send_to_char("#0You tunnel out of the ground.#n\n\r", ch);
        act("$n #0tunnels out of the ground.#n", ch, NULL, NULL, TO_ROOM);
        return;
}

void do_stoneshape(CHAR_DATA * ch, char *argument)
{
        OBJ_DATA *obj;
        char      arg[MAX_INPUT_LENGTH];
        char      buf[MAX_STRING_LENGTH];
        int       cost = 500;

        one_argument(argument, arg);

        if (IS_NPC(ch))
                return;
        if (!IS_RACE(ch, RACE_FIREGIANT)  && !IS_RACE(ch, RACE_HILLGIANT)
        && !IS_RACE(ch, RACE_FROSTGIANT))
        {
                send_to_char("#0This is a Giant Ability#n\n\r", ch);
                return;
        }
        if (arg[0] == '\0')
        {
                send_to_char("Stoneshape what?\n\r", ch);
                return;
        }
        if ((obj = get_obj_carry(ch, arg)) == NULL)
        {
                send_to_char("You dont have that item.\n\r", ch);
                return;
        }
        if ((obj->item_type != ITEM_WEAPON && obj->item_type != ITEM_ARMOR)
            || obj->chobj != NULL || IS_SET(obj->quest, QUEST_GIANTSTONE))
        {
                send_to_char("You are unable to stoneshape this item.\n\r", ch);
                return;
        }
        if (ch->pcgold < cost)
        {
                sprintf(buf,
                        "It costs %d bones to use this power, and you don't have that much.\n\r", cost);
                send_to_char(buf, ch);
                return;
        }
        if (obj->item_type == ITEM_WEAPON)
        {
                obj->value[1] += number_range(1, 8);
                obj->value[2] += number_range(3, 10);
        }
        forge_affect(obj, number_range(1, 5));
        SET_BIT(obj->quest, QUEST_GIANTSTONE);
        ch->pcgold -= cost;
        send_to_char
                ("You shape the ancient stone of the world onto the item, making it more poweful.\n\r", ch);
        return;
}



void do_earthpunch(CHAR_DATA * ch, char *argument)
{
        CHAR_DATA *gch;

        if (IS_NPC(ch))
                return;
        if (!IS_RACE(ch, RACE_FIREGIANT)  && !IS_RACE(ch, RACE_HILLGIANT)
        && !IS_RACE(ch, RACE_FROSTGIANT))
        {
                send_to_char("#0This is a giant Power#n\n\r", ch);
                return;
        }
        send_to_char
                ("You slam your fist into the ground creating a minor earthquake.\n\r",
                 ch);
        act("$n slams $m fist into the ground, creating a minor earthquake.",
            ch, NULL, NULL, TO_ROOM);
        for (gch = ch->in_room->people; gch != NULL; gch = gch->next_in_room)
        {
                if (IS_NPC(gch))
                        continue;
                if (ch == gch)
                        continue;
                if (is_safe(ch, gch))
                        continue;
                if (gch->fighting != NULL)
                {
                        one_hit(ch, gch, gsn_bash, 0);
			if (number_range(1, 8) == 4)
			{
                        	send_to_char("You lose your balance.\n\r", gch);
                        	do_stance(gch, "");
			}
                }
                else
                {
                        send_to_char("You drop to the ground, stunned.\n\r",
                                     gch);
                        stop_fighting(gch, TRUE);
                        gch->position = POS_STUNNED;
                }
        }
        WAIT_STATE(ch, 16);
        return;
}



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

  if (IS_NPC(ch)) return;
  if (!IS_RACE(ch, RACE_ARCHANGEL))
  {  
    send_to_char("#0This is an ArchAngel Ability.#n\n\r",ch);
    return;
  }
  if (ch->alignment != 1000) ch->alignment = 1000;
  if (IS_SET(ch->newbits, NEW_CUBEFORM))
  {
    REMOVE_BIT(ch->newbits, NEW_CUBEFORM);
    REMOVE_BIT(ch->affected_by, AFF_POLYMORPH);
    act( "$n turns into a human.",ch,NULL,NULL,TO_ROOM);
    send_to_char("You turn into your normal form.\n\r",ch);
    ch->damroll -=400;
    ch->hitroll -=400;
    free_string(ch->morph);
    ch->morph=str_dup("");
    return;
  }
  if (ch->move < 2000 || ch->mana < 2000)
  {
    send_to_char("You need 2000 mana and 2000 move to make yourself a true angel.\n\r",ch);
    return;
  }
  else
  {
    act( "$n transforms into an angel.",ch,NULL,NULL,TO_ROOM);
    send_to_char("God is with you, your now one of his divine.\n\r",ch);
    SET_BIT(ch->newbits, NEW_CUBEFORM);
    SET_BIT(ch->affected_by, AFF_POLYMORPH);
    sprintf(buf,"%s the angel",ch->name);
    free_string(ch->morph);
    ch->morph = str_dup(buf);
    ch->move -= 2000;
    ch->mana -= 2000;
    ch->damroll +=400;
    ch->hitroll +=400;
    return;
  }
  return;
}

void do_demonform( 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_RACE(ch, RACE_ARCHDEMON))
    {
	send_to_char("#0This is an ArchDemon Ability.#n\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 human form.", ch, NULL, NULL, TO_CHAR );
        act( "$n's shrinks back into human form.", ch, NULL, NULL, TO_ROOM);
        ch->damroll -= 200;
        ch->hitroll -= 200;
        ch->armor   += 300;
	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->stance[0] != -1) do_stance(ch,"");
	if (ch->mounted == IS_RIDING) do_dismount(ch,"");
        act( "You transform into a huge demon.", ch, NULL, NULL, TO_CHAR);
        act( "$n's body grows and distorts into a huge demon.", ch, NULL, NULL, TO_ROOM );
        ch->pcdata->mod_str = 15;
        ch->pcdata->mod_dex = 15;
        SET_BIT(ch->polyaff, POLY_ZULOFORM);
        SET_BIT(ch->affected_by, AFF_POLYMORPH);
        sprintf(buf, "%s the huge hulking demon", ch->name);
        free_string( ch->morph );
        ch->morph = str_dup( buf );
	ch->damroll += 200;
	ch->hitroll += 200;
        ch->armor   -= 300;
        return;
    }
  


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

    CHAR_DATA *victim;
    char arg [MAX_INPUT_LENGTH];
    int sn;
    int level;
    int spelltype;

	argument = one_argument(argument, arg);

	if (IS_NPC(ch)) return;

	if(!IS_RACE(ch, RACE_DROW)){
		send_to_char("#0Drowfire is a Dark Elf Ability#n\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( "Not on yourself.\n\r", ch );
        return;
    }

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

    if ( ( sn = skill_lookup( "drowfire" ) ) < 0 ) return;
    spelltype = skill_table[sn].target;
    level = ch->spl[spelltype] * 1.5;
    (*skill_table[sn].spell_fun) ( sn, level, ch, victim );
    WAIT_STATE( ch, 12 );
	ch->mana = ch->mana - 100;
    return;
}

void do_darkness(CHAR_DATA *ch, char *argument) 
{
	bool blah = FALSE;

	if (IS_NPC(ch)) return;

    if (!IS_RACE(ch, RACE_DROW))
         {
          send_to_char("#0Darkness is a Drow Ability.#n\n\r", ch);
          return;
         }

	if (ch->fight_timer>0) {
	  send_to_char("Not until your fighttimer expires.\n\r",ch);
	  return;
	}

	if (IS_SET(ch->newbits, NEW_DARKNESS)) {
	send_to_char("You banish your globe of darkness.\n\r", ch );
	act("The globe of darkness around $n disappears.",ch,NULL,NULL,TO_ROOM);
	REMOVE_BIT(ch->newbits, NEW_DARKNESS);
	if (ch->in_room != NULL)
	if (IS_SET(ch->in_room->room_flags, ROOM_TOTAL_DARKNESS))
	REMOVE_BIT(ch->in_room->room_flags, ROOM_TOTAL_DARKNESS);
	return;
	}

	if (ch->mana < 500) {
	send_to_char("You don't have enough mana to summon the darkness.\n\r",ch );
	return;}

	send_to_char("You summon a globe of darkness.\n\r", ch );
	act("$n summons a globe of darkness.",ch,NULL,NULL,TO_ROOM);
	ch->mana -= 500;
	if (IS_SET(ch->extra, TIED_UP)) {
		REMOVE_BIT(ch->extra, TIED_UP);
		blah = TRUE;}

/*	if (IS_AFFECTED(ch, AFF_WEBBED)) {
		REMOVE_BIT(ch->affected_by, AFF_WEBBED);
		blah = TRUE;}
*/
	if (blah) send_to_char("The darkness sets you free.\n\r", ch );		

	SET_BIT(ch->newbits, NEW_DARKNESS);
	if (!IS_SET(ch->in_room->room_flags, ROOM_TOTAL_DARKNESS))
	SET_BIT(ch->in_room->room_flags, ROOM_TOTAL_DARKNESS);
	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_RACE(ch, RACE_DRAGONKIND))
	 {
	  send_to_char("#0Fly is a Dragon Ability.#n\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 ( victim->fight_timer == 0 && !IS_IMMUNE(victim, IMM_SUMMON) && !IS_NPC(victim) && !IS_IMMORTAL(ch))
	{
	  send_to_char("You can't find them.\n\r", ch);
	  return;
	}

	if(IS_SET(victim->in_room->room_flags, ROOM_ASTRAL) || IS_SET(ch->in_room->room_flags, ROOM_ASTRAL))
	  {
	   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" );
	WAIT_STATE(ch,4);
	if ( (mount = victim->mount) == NULL ) return;
	char_from_room( mount );
	char_to_room( mount, get_room_index(victim->in_room->vnum) );
	return;
}


void do_ascension(CHAR_DATA *ch, char *argument)
{
  char arg1[MAX_STRING_LENGTH];
  argument = one_argument( argument, arg1 );

  if (IS_NPC(ch))return;

  if (!IS_NPC(ch) && ch->pcRaceLevel < 200)
  {   
    send_to_char("You must be level 200 to Ascend\n\r",ch);
    return;
  }
  if (ch->level < 3)
  {
    send_to_char("You must be avatar to Ascend.\n\r",ch);
    return;
  }
if ( arg1[0] == '\0' )
{
  send_to_char("Ascension  : Type Ascend (race) to choose your Demi-God Race.\n\r\n\r",ch);
  send_to_char("Options are ArchDemon or ArchAngel.\n\r\n\r",ch);
  return;
}

do_clearstats2(ch,"");

if (!str_cmp(arg1,"archdemon"))
{
	ch->pcRace = RACE_ARCHDEMON;
	send_to_char( "You have Become An Arch-Demon Demi-God.\n\r", ch);
	return;
}
else if (!str_cmp(arg1,"archangel"))
{
        ch->pcRace = RACE_ARCHANGEL;
        send_to_char( "You have Become an ArchAngel.\n\r", ch);
        return;
}

}


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

	if (IS_NPC(ch))
	return;

	send_to_char("[--------------------[Race Powers]--------------------]\n\r", ch);

        if (IS_RACE(ch, RACE_MTDWARF) || IS_RACE(ch, RACE_GULLYDWARF)
	  || IS_RACE(ch, RACE_HILLDWARF) || IS_RACE(ch, RACE_AQUATICDWARF)
	  || IS_RACE(ch, RACE_ARCTICDWARF) || IS_RACE(ch, RACE_DEEPDWARF)
	  || IS_RACE(ch, RACE_DESERTDWARF) || IS_RACE(ch, RACE_DREAMDWARF)
	  || IS_RACE(ch, RACE_EARTHDWARF) || IS_RACE(ch, RACE_GOLDDWARF) 
	  || IS_RACE(ch, RACE_GREYDWARF) || IS_RACE(ch, RACE_JUNGLEDWARF)
	  || IS_RACE(ch, RACE_DUERGARDWARF))
 	{
	send_to_char("#R(#0ThunderHammer#R)#0 Charge an ethereal Hammer and send a shockwave.#n\n\r", ch);
	send_to_char("#R(#0Tunnel#R)#0 Racial Travel.#n\n\r", ch);
	}
        if (IS_RACE(ch, RACE_GOBLIN) || IS_RACE(ch, RACE_HOBGOBLIN))
        {
        send_to_char("#R(#0Goblingrenade#R)#0 Drop a Goblin Grenade.#n\n\r", ch);
        }
        if (IS_RACE(ch, RACE_MINOTAUR))
        {
        send_to_char("#R(#0Gore#R)#0 Gore your opponent!!#n\n\r", ch);
        }
        if (IS_RACE(ch, RACE_KENDER))
        {
        send_to_char("#R(#0Pirate#R)#0 Steal equipment from your opponent!!#n\n\r", ch);
        }
        if (IS_RACE(ch, RACE_GNOLL))
        {
        send_to_char("#R(#0Jawlock#R)#0 Clamp onto Enemy, preventing Flee!!#n\n\r", ch);
        }
        if (IS_RACE(ch, RACE_OGREMAGE))
        {
        send_to_char("#R(#0Chant#R)#0 Damage, Heal, Curse, Bless#n\n\r", ch);
        }
        if (IS_RACE(ch, RACE_DRAGONKIND))
        {
        send_to_char("#R(#0Fly#R)#0 Racial Travel method.#n\n\r", ch);
        }
	  if (IS_RACE(ch, RACE_GNOME))
        {
        send_to_char("#R(#0AirshipTravel#R)#0 Supreme method of travel.#n\n\r", ch);
        }
        if (IS_RACE(ch, RACE_MTDWARF) || IS_RACE(ch, RACE_GULLYDWARF)
	  || IS_RACE(ch, RACE_HILLDWARF) || IS_RACE(ch, RACE_AQUATICDWARF)
	  || IS_RACE(ch, RACE_ARCTICDWARF) || IS_RACE(ch, RACE_DEEPDWARF)
	  || IS_RACE(ch, RACE_DESERTDWARF) || IS_RACE(ch, RACE_DREAMDWARF)
	  || IS_RACE(ch, RACE_EARTHDWARF) || IS_RACE(ch, RACE_GOLDDWARF) 
	  || IS_RACE(ch, RACE_GREYDWARF) || IS_RACE(ch, RACE_JUNGLEDWARF)
	  || IS_RACE(ch, RACE_DUERGARDWARF) || IS_RACE(ch, RACE_ELF) 
	  || IS_RACE(ch, RACE_HALFELF) || IS_RACE(ch, RACE_GNOME) 
	  || IS_RACE(ch, RACE_DROW) || IS_RACE(ch, RACE_WILDELF) 
	  || IS_RACE(ch, RACE_ARCHANGEL) || IS_RACE(ch, RACE_ARCHDEMON))
        {
        send_to_char("#R(#0Infravision#R)#0 The Ability to see at night.#n\n\r", ch);
        }
	if (IS_RACE(ch, RACE_ELF) || IS_RACE(ch, RACE_WILDELF)
	|| IS_RACE(ch, RACE_HALFELF) || IS_RACE(ch, RACE_DROW))
	{
        send_to_char("#R(#0ElfSing#R)#0 Sing Songs.#n\n\r", ch);
        send_to_char("#R(#0Lessons#R)#0 Learn Songs.#n\n\r", ch);
        send_to_char("#R(#0Songs#R)#0 Listing of Songs.#n\n\r", ch);
	}
        if (IS_RACE(ch, RACE_TROLL) || IS_RACE(ch, RACE_HALFTROLL)
        || IS_RACE(ch, RACE_ARCHANGEL) || IS_RACE(ch, RACE_ARCHDEMON)
        || IS_RACE(ch, RACE_DRAGONKIND))
        {
        send_to_char("#R(#0Toughskin#R)#0 Have your Skin take a Leathery Texture.#n\n\r", ch);
        }
	if (IS_RACE(ch, RACE_ARCHDEMON))
        {
        send_to_char("#R(#0Demonform#R)#0 Change into a Monsterous Demon#n\n\r", ch);
        }
	if(IS_RACE(ch, RACE_ARCHANGEL))
	{
	send_to_char("#R(#0gfavor#R)#0 Angel Form#n\n\r", ch);
	}
        if(IS_RACE(ch, RACE_FIREGIANT) || IS_RACE(ch, RACE_FROSTGIANT) || IS_RACE(ch, RACE_HILLGIANT))
        {
        send_to_char("#R(#0Earthpunch#R)#0 Bash/Stun those in the room.#n\n\r", ch);
        send_to_char("#R(#0Stoneshape#R)#0 Increase average damage of weapon.#n\n\r", ch);
        }
        send_to_char("[--------------------[  level 25  ]-------------------]\n\r", ch);
        if (ch->pcRaceLevel >= 25)
        {
        send_to_char("#R(#0WeaponEnhance#R)#0 Raise the average damage on a weapon.#n\n\r", ch);
        send_to_char("#R(#0ArmorEnhance#R)#0 AC bonus to armor.#n\n\r", ch);
        }
        if (IS_RACE(ch, RACE_MINOTAUR) || IS_RACE(ch, RACE_OGRE)
        || IS_RACE(ch, RACE_HALFOGRE) || IS_RACE(ch, RACE_GIANT))
        {
        send_to_char("#R(#0Tremble#R)#0 The ability to destance your opponent.#n\n\r", ch);
        }
	send_to_char("[--------------------[  level 50  ]-------------------]\n\r", ch);
        if (ch->pcRaceLevel >= 50)
        {
        send_to_char("#R(#0Mistform#R)#0 The Ability to turn Ethereal.#n\n\r", ch);
        send_to_char("#R(#0Flameblade#R)#0 The Power to surround a blade with Flames.#n\n\r", ch);
        }
        send_to_char("[--------------------[Race Powers]--------------------]\n\r", ch);


	return;
}


void do_raceself(CHAR_DATA *ch, char *argument)
{
  char arg1[MAX_STRING_LENGTH];
  argument = one_argument( argument, arg1 );

  if (IS_NPC(ch))return;

  if (!IS_NPC(ch) && ch->pcRace != 0)
  {   
    send_to_char("You already have a race.\n\r",ch);
    return;
  }
  if (ch->level < 3)
  {
    send_to_char("You must be avatar to selfrace.\n\r",ch);
    return;
  }
if ( arg1[0] == '\0' )
{
  send_to_char("Races: Type selfrace (race) to choose your Race.\n\r\n\r",ch);
  send_to_char("#0<<--------------------------------------------------------------------------------->> \n\r",ch);
  send_to_char("#0BugBear			Giant, Fire		Kender\n\r",ch);
  send_to_char("#0Centaur			Giant, Frost		Kobold, Aquatic\n\r",ch);
  send_to_char("#0Dwarf, Aquatic		Giant, Hill		Kobold, Arctic\n\r",ch);
  send_to_char("#0Dwarf, Arctic		Gnome, Air		Kobold, Desert\n\r",ch);
  send_to_char("#0Dwarf, Deep		Gnome, Aquatic		Kobold, Earth\n\r",ch);
  send_to_char("#0Dwarf, Desert		Gnome, Arctic		Kobold, Jungle\n\r",ch);
  send_to_char("#0Dwarf, Dream		Gnome, Chaos		Minotaur\n\r",ch);
  send_to_char("#0Dwarf, Earth		Gnome, Deep		Ogre\n\r",ch);
  send_to_char("#0Dwarf, Gold		Gnome, Desert		OgreMage\n\r",ch);
  send_to_char("#0Dwarf, Grey		Gnome, Forest		Orc\n\r",ch);
  send_to_char("#0Dwarf, Hill		Gnome, Jungle		Pixie\n\r",ch);
  send_to_char("#0Dwarf, Jungle		Gnome, Rock		Troll\n\r",ch);
  send_to_char("#0Elf, Aquatic		Goblin, Air\n\r",ch);
  send_to_char("#0Elf, Arctic		Goblin, Aquatic\n\r",ch);
  send_to_char("#0Elf, Dark(drow)		Goblin, Arctic\n\r",ch);
  send_to_char("#0Elf, Desert		Goblin, Desert\n\r",ch);
  send_to_char("#0Elf, Fire		Goblin, Forestkith\n\r",ch);
  send_to_char("#0Elf, Ghost		Goblin, Jungle\n\r",ch);
  send_to_char("#0Elf, Gray		Half-Elf\n\r",ch);
  send_to_char("#0Elf, High		Half-Ogre\n\r",ch);
  send_to_char("#0Elf, Jungle		Half-Orc\n\r",ch);
  send_to_char("#0Elf, Wild		Half-Troll\n\r",ch);
  send_to_char("#0Elf, Wood		Hobbit\n\r",ch);
  send_to_char("#0Gnoll			Human\n\r",ch);
  send_to_char("#0<<--------------------------------------------------------------------------------->> \n\r",ch);

  return;
}

do_clearstats2(ch,"");

if (!str_cmp(arg1,"human"))
{
	ch->pcRace = RACE_HUMAN;
	ch->pcsize = SIZE_MEDIUM;
	send_to_char( "You have Become Human.\n\r", ch);
	return;
}
else if (!str_cmp(arg1,"highelf"))
{
	ch->pcRace = RACE_ELF;
	ch->pcsize = SIZE_MEDIUM;
	send_to_char( "You have Become a High Elf.\n\r", ch);
        return;
}
/*else if (!str_cmp(arg1,"gnome"))
{
	ch->pcRace = RACE_GNOME;
	ch->pcsize = SIZE_SMALL;
	send_to_char( "You have Become a Gnome.\n\r", ch);
        return;
}
*/
else if (!str_cmp(arg1,"gullydwarf"))
{
	ch->pcRace = RACE_GULLYDWARF;
	ch->pcsize = SIZE_MEDIUM;
	send_to_char( "You have Become a Gully Dwarf.\n\r", ch);
        return;
}
else if (!str_cmp(arg1,"hilldwarf"))
{
	ch->pcRace = RACE_HILLDWARF;
	ch->pcsize = SIZE_MEDIUM;
	send_to_char( "You have Become a Hill Dwarf.\n\r", ch);
        return;
}
else if (!str_cmp(arg1,"mountaindwarf"))
{
	ch->pcRace = RACE_MTDWARF;
	ch->pcsize = SIZE_MEDIUM;
	send_to_char( "You have Become a MT. Dwarf.\n\r", ch);
        return;
}
else if (!str_cmp(arg1,"dragonkind"))
{
	ch->pcRace = RACE_DRAGONKIND;
	ch->pcsize = SIZE_GIANT;
	send_to_char( "You have Become Dragonkind.\n\r", ch);
        return;
}
else if (!str_cmp(arg1,"hobbit"))
{
	ch->pcRace = RACE_HOBBIT;
	ch->pcsize = SIZE_SMALL;
	send_to_char( "You have become a Shireling.\n\r", ch);
        return;
}
else if (!str_cmp(arg1,"kender"))
{
	ch->pcRace = RACE_KENDER;
	send_to_char( "Your Feet feel the calling of Wanderlust.\n\r", ch);
        return;
}
else if (!str_cmp(arg1,"drow"))
{
	ch->pcRace = RACE_DROW;
	send_to_char( "The Suns becomes Brilliant and painful to your eyes.\n\r", ch);
        return;
}
/*
else if (!str_cmp(arg1,"giant"))
{
	ch->pcRace = RACE_GIANT;
	send_to_char( "You choose to stay a Giant.\n\r", ch);
        return;
}
*/
else if (!str_cmp(arg1,"halfelf"))
{
	ch->pcRace = RACE_HALFELF;
	ch->pcsize = SIZE_MEDIUM;
	send_to_char( "You are a Half Elf.\n\r", ch);
        return;
}
else if (!str_cmp(arg1,"ogre"))
{
	ch->pcRace = RACE_OGRE;
	ch->pcsize = SIZE_LARGE;
	send_to_char( "You are an Ogre.\n\r", ch);
        return;
}
else if (!str_cmp(arg1,"halfogre"))
{
	ch->pcRace = RACE_HALFOGRE;
	ch->pcsize = SIZE_LARGE;
	send_to_char( "You are a Half Ogre.\n\r", ch);
        return;
}
else if (!str_cmp(arg1,"ogremage"))
{
	ch->pcRace = RACE_OGREMAGE;
	ch->pcsize = SIZE_LARGE;
	send_to_char( "You are an Ogre Mage.\n\r", ch);
        return;
}
else if (!str_cmp(arg1,"minotaur"))
{
	ch->pcRace = RACE_MINOTAUR;
	ch->pcsize = SIZE_LARGE;
	send_to_char( "You grow in stature, Your skin turns red and Bull Horns sprout from your head.\n\r", ch);
        return;
}
/*else if (!str_cmp(arg1,"goblin"))
{
	ch->pcRace = RACE_GOBLIN;
	ch->pcsize = SIZE_SMALL;
	send_to_char( "You are a stinky, thieving little goblin.\n\r", ch);
	return;
}
*/
else if (!str_cmp(arg1,"airgoblin"))
{
	ch->pcRace = RACE_AIRGOBLIN;
	ch->pcsize = SIZE_SMALL;
	send_to_char( "You are a stinky, thieving little goblin.\n\r", ch);
	return;
}
else if (!str_cmp(arg1,"aquaticgoblin"))
{
	ch->pcRace = RACE_AQUATICGOBLIN;
	ch->pcsize = SIZE_SMALL;
	send_to_char( "You are a stinky, thieving little goblin.\n\r", ch);
	return;
}
else if (!str_cmp(arg1,"arcticgoblin"))
{
	ch->pcRace = RACE_ARCTICGOBLIN;
	ch->pcsize = SIZE_SMALL;
	send_to_char( "You are a stinky, thieving little goblin.\n\r", ch);
	return;
}
else if (!str_cmp(arg1,"desertgoblin"))
{
	ch->pcRace = RACE_DESERTGOBLIN;
	ch->pcsize = SIZE_SMALL;
	send_to_char( "You are a stinky, thieving little goblin.\n\r", ch);
	return;
}
else if (!str_cmp(arg1,"forestkith"))
{
	ch->pcRace = RACE_GOBLINFORESTKITH;
	ch->pcsize = SIZE_SMALL;
	send_to_char( "You are a stinky, thieving little goblin.\n\r", ch);
	return;
}
else if (!str_cmp(arg1,"junglegoblin"))
{
	ch->pcRace = RACE_JUNGLEGOBLIN;
	ch->pcsize = SIZE_SMALL;
	send_to_char( "You are a stinky, thieving little goblin.\n\r", ch);
	return;
}
else if (!str_cmp(arg1,"hobgoblin"))
{
	ch->pcRace = RACE_HOBGOBLIN;
	ch->pcsize = SIZE_MEDIUM;
	send_to_char( "You are a Hobgoblin Commander of a Goblin Squad.\n\r", ch);
	return;
}
else if (!str_cmp(arg1,"duergar"))
{
	ch->pcRace = RACE_DUERGARDWARF;
	ch->pcsize = SIZE_MEDIUM;
	send_to_char( "You are now a Duergar Dwarf.\n\r", ch);
	return;
}
else if (!str_cmp(arg1,"troll"))
{
	ch->pcRace = RACE_TROLL;
	ch->pcsize = SIZE_LARGE;
	SET_BIT(ch->vuln, VULN_FIRE);
	send_to_char( "You are now a Troll.\n\r", ch);
	return;
}
else if (!str_cmp(arg1,"orc"))
{
	ch->pcRace = RACE_ORC;
	ch->pcsize = SIZE_MEDIUM;
	send_to_char( "You are now an Orc.\n\r", ch);
	return;
}
else if (!str_cmp(arg1,"halforc"))
{
	ch->pcRace = RACE_HALFORC;
	ch->pcsize = SIZE_MEDIUM;
	send_to_char( "You are now a Half-Orc.\n\r", ch);
	return;
}
else if (!str_cmp(arg1,"centaur"))
{
	ch->pcRace = RACE_CENTAUR;
	ch->pcsize = SIZE_LARGE;
	send_to_char( "you are now a Centaur.\n\r", ch);
	return;
}
else if (!str_cmp(arg1,"wildelf"))
{
	ch->pcRace = RACE_WILDELF;
	ch->pcsize = SIZE_MEDIUM;
	send_to_char( "You are a Wild Elf.\n\r", ch);
	return;
}
else if (!str_cmp(arg1,"aquaticelf"))
{
	ch->pcRace = RACE_AQUATICELF;
	ch->pcsize = SIZE_MEDIUM;
	send_to_char( "You are an Aquatic Elf.\n\r", ch);
	return;
}
else if (!str_cmp(arg1,"arcticelf"))
{
	ch->pcRace = RACE_ARCTICELF;
	ch->pcsize = SIZE_MEDIUM;
	send_to_char( "You are an Arctic Elf.\n\r", ch);
	return;
}
else if (!str_cmp(arg1,"desertelf"))
{
	ch->pcRace = RACE_DESERTELF;
	ch->pcsize = SIZE_MEDIUM;
	send_to_char( "You are a Desert Elf.\n\r", ch);
	return;
} 
else if (!str_cmp(arg1,"fireelf"))
{
	ch->pcRace = RACE_FIREELF;
	ch->pcsize = SIZE_MEDIUM;
	send_to_char( "You are a Fire Elf.\n\r", ch);
	return;
}
else if (!str_cmp(arg1,"ghostelf"))
{
	ch->pcRace = RACE_GHOSTELF;
	ch->pcsize = SIZE_MEDIUM;
	send_to_char( "You are a Ghost Elf.\n\r", ch);
	return;
}
else if (!str_cmp(arg1,"grayelf"))
{
	ch->pcRace = RACE_GRAYELF;
	ch->pcsize = SIZE_MEDIUM;
	send_to_char( "You are a Gray Elf.\n\r", ch);
	return;
}
else if (!str_cmp(arg1,"jungleelf"))
{
	ch->pcRace = RACE_JUNGLEELF;
	ch->pcsize = SIZE_MEDIUM;
	send_to_char( "You are a Jungle Elf.\n\r", ch);
	return;
}
else if (!str_cmp(arg1,"woodelf"))
{
	ch->pcRace = RACE_WOODELF;
	ch->pcsize = SIZE_MEDIUM;
	send_to_char( "You are a Wood Elf.\n\r", ch);
	return;
}
else if (!str_cmp(arg1,"aquaticdwarf"))
{
	ch->pcRace = RACE_AQUATICDWARF;
	ch->pcsize = SIZE_MEDIUM;
	send_to_char( "You are an Aquatic Dwarf.\n\r", ch);
	return;
}
else if (!str_cmp(arg1,"arcticdwarf"))
{
	ch->pcRace = RACE_ARCTICDWARF;
	ch->pcsize = SIZE_MEDIUM;
	send_to_char( "You are an Arctic Dwarf.\n\r", ch);
	return;
}
else if (!str_cmp(arg1,"deepdwarf"))
{
	ch->pcRace = RACE_DEEPDWARF;
	ch->pcsize = SIZE_MEDIUM;
	send_to_char( "You are a Deep Dwarf.\n\r", ch);
	return;
}
else if (!str_cmp(arg1,"desertdwarf"))
{
	ch->pcRace = RACE_DESERTDWARF;
	ch->pcsize = SIZE_MEDIUM;
	send_to_char( "You are a Desert Dwarf.\n\r", ch);
	return;
}
else if (!str_cmp(arg1, "dreamdwarf"))
{
	ch->pcRace = RACE_DREAMDWARF;
	ch->pcsize = SIZE_MEDIUM;
	send_to_char( "You are a Dream Dwarf.\n\r", ch);
	return;
}
else if (!str_cmp(arg1,"earthdwarf"))
{
	ch->pcRace = RACE_EARTHDWARF;
	ch->pcsize = SIZE_MEDIUM;
	send_to_char( "You are a Earth Dwarf.\n\r", ch);
	return;
}
else if (!str_cmp(arg1,"golddwarf"))
{
	ch->pcRace = RACE_GOLDDWARF;
	ch->pcsize = SIZE_MEDIUM;
	send_to_char( "You are a Gold Dwarf.\n\r", ch);
	return;
}
else if (!str_cmp(arg1,"greydwarf"))
{
	ch->pcRace = RACE_GREYDWARF;
	ch->pcsize = SIZE_MEDIUM;
	send_to_char( "You are a Grey Dwarf.\n\r", ch);
	return;
}
else if (!str_cmp(arg1,"jungledwarf"))
{
	ch->pcRace = RACE_JUNGLEDWARF;
	ch->pcsize = SIZE_MEDIUM;
	send_to_char( "You are a Jungle Dwarf.\n\r", ch);
	return;
}
else if (!str_cmp(arg1,"aquatickobold"))
{
	ch->pcRace = RACE_AQUATICKOBOLD;
	ch->pcsize = SIZE_SMALL;
	send_to_char( "You are an Aquatic Kobold.\n\r", ch);
	return;
}
else if (!str_cmp(arg1,"arctickobold"))
{
	ch->pcRace = RACE_ARCTICKOBOLD;
	ch->pcsize = SIZE_SMALL;
	send_to_char( "You are an Arctic Kobold.\n\r", ch);
	return;
}
else if (!str_cmp(arg1,"desertkobold"))
{
	ch->pcRace = RACE_DESERTKOBOLD;
	ch->pcsize = SIZE_SMALL;
	send_to_char( "You are a Desert Kobold.\n\r", ch);
	return;
}
else if (!str_cmp(arg1,"earthkobold"))
{
	ch->pcRace = RACE_EARTHKOBOLD;
	ch->pcsize = SIZE_SMALL;
	send_to_char( "You are a Earth Kobold.\n\r", ch);
	return;
}
else if (!str_cmp(arg1,"junglekobold"))
{
	ch->pcRace = RACE_JUNGLEKOBOLD;
	ch->pcsize = SIZE_SMALL;
	send_to_char( "You are a Jungle Kobold.\n\r", ch);
	return;
}
else if (!str_cmp(arg1,"hillgiant"))
{
	ch->pcRace = RACE_HILLGIANT;
	ch->pcsize = SIZE_GIANT;
	send_to_char( "You are a Hill Giant.\n\r", ch);
	return;
}
else if (!str_cmp(arg1,"firegiant"))
{
	ch->pcRace = RACE_FIREGIANT;
	ch->pcsize = SIZE_GIANT;
	send_to_char( "You are a Fire Giant.\n\r", ch);
	return;
}
else if (!str_cmp(arg1,"frostgiant"))
{
	ch->pcRace = RACE_FROSTGIANT;
	ch->pcsize = SIZE_GIANT;
	send_to_char( "You are a Frost Giant.\n\r", ch);
	return;
}
else if (!str_cmp(arg1,"pixie"))
{
	ch->pcRace = RACE_PIXIE;
	ch->pcsize = SIZE_SMALL;
	send_to_char( "You are a Pixie.\n\r", ch);
	return;
}
else if (!str_cmp(arg1,"aquaticgnome"))
{
	ch->pcRace = RACE_AQUATICGNOME;
	ch->pcsize = SIZE_SMALL;
	send_to_char( "You are an Aquatic Gnome\n\r", ch);
	return;
}
else if (!str_cmp(arg1,"arcticgnome"))
{
	ch->pcRace = RACE_ARCTICGNOME;
	ch->pcsize = SIZE_SMALL;
	send_to_char( "You are an Arctic Gnome\n\r", ch);
	return;
}
else if (!str_cmp(arg1,"chaosgnome"))
{
	ch->pcRace = RACE_CHAOSGNOME;
	ch->pcsize = SIZE_SMALL;
	send_to_char( "You are a Chaos Gnome\n\r", ch);
	return;
}
else if (!str_cmp(arg1,"deepgnome"))
{
	ch->pcRace = RACE_DEEPGNOME;
	ch->pcsize = SIZE_SMALL;
	send_to_char( "You are a Deep Gnome\n\r", ch);
	return;
}
else if (!str_cmp(arg1,"desertgnome"))
{
	ch->pcRace = RACE_DESERTGNOME;
	ch->pcsize = SIZE_SMALL;
	send_to_char( "You are a Desert Gnome\n\r", ch);
	return;
}
else if (!str_cmp(arg1,"forestgnome"))
{
	ch->pcRace = RACE_FORESTGNOME;
	ch->pcsize = SIZE_SMALL;
	send_to_char( "You are a Forest Gnome\n\r", ch);
	return;
}
else if (!str_cmp(arg1,"junglegnome"))
{
	ch->pcRace = RACE_JUNGLEGNOME;
	ch->pcsize = SIZE_SMALL;
	send_to_char( "You are a Jungle Gnome\n\r", ch);
	return;
}
else if (!str_cmp(arg1,"rockgnome"))
{
	ch->pcRace = RACE_ROCKGNOME;
	ch->pcsize = SIZE_SMALL;
	send_to_char( "You are a Rock Gnome\n\r", ch);
	return;
}
else if (!str_cmp(arg1,"bugbear"))
{
	ch->pcRace = RACE_BUGBEAR;
	ch->pcsize = SIZE_MEDIUM;
	send_to_char( "You are a Bugbear\n\r", ch);
	return;
}









































 else do_raceself(ch,"");   
  return;
}


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

	if (!IS_RACE(ch, RACE_ELF) && !IS_RACE(ch, RACE_HALFELF)
	&& !IS_RACE(ch, RACE_GNOME) && !IS_RACE(ch, RACE_DUERGARDWARF)
	&& !IS_RACE(ch, RACE_GULLYDWARF) && !IS_RACE(ch, RACE_HILLDWARF)
	&& !IS_RACE(ch, RACE_MTDWARF) && !IS_RACE(ch, RACE_DROW)
	&& !IS_RACE(ch, RACE_WILDELF) && !IS_RACE(ch, RACE_ARCHANGEL)
	&& !IS_RACE(ch, RACE_ARCHDEMON))
          {
             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 Infravision Fades.\n\r",
                                     ch);
                }
                else
                {
                        SET_BIT(ch->act, PLR_HOLYLIGHT);
                        send_to_char("Your eyes glow red with Infravision.\n\r",
                                     ch);
                }
	 return;
}



void do_mistform(CHAR_DATA * ch, char *argument)
{
        if (IS_NPC(ch))
                return;
        if (ch->pcRaceLevel < 50)
        {
                send_to_char("You need your race level to 50 to use this.\n\r", ch);
                return;
        }
        if (IS_AFFECTED(ch, AFF_ETHEREAL))
        {
                REMOVE_BIT(ch->affected_by, AFF_ETHEREAL);
                act("You shift back int your solid material form.", ch, NULL, NULL,
                    TO_CHAR);
                act("$n regains $s form and re-enters their solid form.", ch, NULL,
                    NULL, TO_ROOM);
                return;
        }
        if (has_timer(ch))
                return;
        SET_BIT(ch->affected_by, AFF_ETHEREAL);
        act("You shift into the ethereal realm.", ch, NULL, NULL, TO_CHAR);
        act("$n turns ethereal.", ch, NULL, NULL, TO_ROOM);
        return;
}


void do_goblingrenade(CHAR_DATA * ch, char *argument)
{
        CHAR_DATA *vch;
        CHAR_DATA *vch_next;
        int       dam;
        int       level;


        if (IS_NPC(ch))
                return;

	if (!IS_RACE(ch, RACE_GOBLIN) && !IS_RACE(ch, RACE_HOBGOBLIN))
	{
                send_to_char("Huh?\n\r", ch);
                return;
        }

        if (ch->mana < 1150)
        {
                send_to_char("You need more mana.\n\r", ch);
                return;
        }

        level = ch->spl[PURPLE_MAGIC];
        ch->mana -= 1150;

        send_to_char
                ("You pull the pin on a Goblin Grenade.\n\r",
                 ch);
        act("$n drops a Goblin Grenade!", ch, NULL, NULL, TO_ROOM);

        for (vch = ch->in_room->people; vch != NULL; vch = vch_next)
        {
                vch_next = vch->next_in_room;

                if (vch == ch)
                        continue;
                if (vch->trust > 6)
                        continue;
                dam = dice(level, 40);
                if (saves_spell(level, vch))
                        dam /= 2;
                damage(ch, vch, dam, skill_lookup("earthquake"));
        }
        WAIT_STATE(ch, 9);
        return;
}


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

        argument = one_argument(argument, arg);

        if (IS_NPC(ch))
                return;

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

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

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

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

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

        send_to_char("You set off a signal flare and an airship picks you up.\n\r", ch);
        act("$n sets off a signal flare and is picked up by an airship.", ch, NULL, NULL, TO_ROOM);
        char_from_room(ch);
        char_to_room(ch, victim->in_room);
        do_look(ch, "");
        send_to_char("You are dropped off by a Gnome Airship.\n\r", ch);
        act("$n is dropped off by a Gnome Airship.", ch, NULL, NULL, TO_ROOM);
        return;
}


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

	char buf[MAX_STRING_LENGTH];
	char buf2[MAX_STRING_LENGTH];
	CHAR_DATA *vch;
	CHAR_DATA *vch_next;
	int dam;
	dam = 6000;
	dam *= 4;
	dam /= 2;
	
	if(IS_NPC(ch)) return;
	
        if (!IS_RACE(ch, RACE_MTDWARF) && !IS_RACE(ch, RACE_GULLYDWARF)
	  && !IS_RACE(ch, RACE_HILLDWARF) && !IS_RACE(ch, RACE_AQUATICDWARF)
	  && !IS_RACE(ch, RACE_ARCTICDWARF) && !IS_RACE(ch, RACE_DEEPDWARF)
	  && !IS_RACE(ch, RACE_DESERTDWARF) && !IS_RACE(ch, RACE_DREAMDWARF)
	  && !IS_RACE(ch, RACE_EARTHDWARF) && !IS_RACE(ch, RACE_GOLDDWARF) 
	  && !IS_RACE(ch, RACE_GREYDWARF) && !IS_RACE(ch, RACE_JUNGLEDWARF)
	  && !IS_RACE(ch, RACE_DUERGARDWARF))
	{
		stc("#0This is a Dwarven Area Attack#n\n\r",ch);
		return;
	}
	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) )
	        {
		if(is_safe(ch,vch)) continue;
	          sprintf(buf, "#0Your body is struck by lightning! [#C%d#n]\n\r", dam);
	          send_to_char( buf, vch );
	          sprintf(buf2, "#r%s's#0 body is struck by lightning! [#C%d#n]\n\r",vch->name, dam);
	          send_to_char( buf2, ch );
	          set_fighting(ch,vch);
	          hurt_person(ch,vch,dam);
	        }
	      }
	
	WAIT_STATE(ch,8);

}




void do_lessons(CHAR_DATA *ch, char *argument)
{
 char buf[MAX_INPUT_LENGTH];
 int cost;
 int cost2;
 cost = ch->pcdata->powers[BARD_LESSONS] * 100000;  
 cost2 = cost - ch->exp;


if (!IS_RACE(ch, RACE_ELF) && !IS_RACE(ch, RACE_WILDELF)
&& !IS_RACE(ch, RACE_HALFELF) && !IS_RACE(ch, RACE_DROW))
{
 send_to_char("Huh?\n\r", ch);
 return;
}

if (argument[0] == '\0')
{
 send_to_char("Options are: show, improve.\n\r", ch);
 return;
}
if (!str_cmp(argument, "show"))
{
 sprintf(buf, "Your skill is currently at %d.\n\r", ch->pcdata->powers[BARD_LESSONS]);
 send_to_char(buf, ch);
}
else if (!str_cmp(argument, "improve"))
{
 if (ch->exp < cost)
 {
  sprintf(buf, "You need %d more experience.\n\r", cost2);
  send_to_char(buf, ch);
  return;
 }
 if (ch->pcdata->powers[BARD_LESSONS] >= 10)
 {
  send_to_char("You're already as skilled as you can become.\n\r", ch);
  return;
 }
 ch->exp -= cost;
 send_to_char("You learn a little more about the arts.\n\r", ch);
 ch->pcdata->powers[BARD_LESSONS]++;
 return;
}
else 
{
 send_to_char("Try improve or show.\n\r", ch);
 return;
}
return;
}

void do_elfsing(CHAR_DATA *ch, char *argument) 
{
 char buf[MAX_INPUT_LENGTH];
 char arg1[MAX_INPUT_LENGTH];
 char arg2[MAX_INPUT_LENGTH];
  int chance;
  int dam[4];
 CHAR_DATA *victim;
 argument = one_argument(argument, arg1);
 argument = one_argument(argument, arg2);



if (!IS_RACE(ch, RACE_ELF) && !IS_RACE(ch, RACE_WILDELF)
&& !IS_RACE(ch, RACE_HALFELF) && !IS_RACE(ch, RACE_DROW))
{
 send_to_char("Huh?\n\r", ch);
 return;
}

 if (arg1[0] == '\0')
 {
  send_to_char("Syntax: sing (song) (target)\n\r", ch);
  send_to_char("Possible Songs: \n\r", ch);
  send_to_char("Minuet, Minne, Madrigal, March, Dissonance \n\r", ch);
  send_to_char("Requiem, Paeon, Ballad, Lullaby, Hymnus, Spiritual \n\r", 
ch);
  return;
 }
  if (str_cmp(arg1, "minuet") && str_cmp(arg1, "minne") && str_cmp(arg1, "madrigal") &&
str_cmp(arg1, "march") && str_cmp(arg1, "requiem") && str_cmp(arg1, "paeon") &&
str_cmp(arg1, "ballad") && str_cmp(arg1, "lullaby") && str_cmp(arg1, "hymnnus") &&
str_cmp(arg1, "spiritual") && str_cmp(arg1, "dissonance"))
  {
   send_to_char("Possible Songs: Minuet, Minne, Madrigal, March, Requiem, Paeon,\n\r", ch);
   send_to_char("Ballad, Lullaby, Hymnus, Dissonance, Spiritual\n\r", ch);
   return;
  }
  
  if (!str_cmp(arg2, "self") || !str_cmp(arg2, ch->name))
   victim = ch;
  else if ((victim = get_char_room(ch, arg2)) == NULL)
  {
   send_to_char("They aren't here.\n\r", ch);
   return;
  }
  
  if (ch->pcdata->powers[SONG_MASTERY] < 1)
   ch->pcdata->powers[SONG_MASTERY] = 1;

  chance = number_range(1, ch->pcdata->powers[BARD_LESSONS]);
  if (chance == 1)
  {
   if (ch->pcdata->powers[SONG_MASTERY] < 10)
   {
    send_to_char("Your skill at singing improves.\n\r", ch);
    ch->pcdata->powers[SONG_MASTERY]++;
   }
  }

  if (!str_cmp(arg1, "minuet"))
  {
   if (IS_NPC(victim))
   { 
    send_to_char("Not on NPCs.\n\r", ch);
    return;
   }
   if (victim->pcdata->songs[SONG_MINUET] > 0)
   {
    send_to_char("They're already affected!\n\r", ch);
    return;
   }
   sprintf(buf, "#nYou sing a wonderful #rminuet#n to %s.\n\r", victim->name);
   send_to_char(buf, ch);
   sprintf(buf, "#n%s sings a wonderful #rminuet#n to you.\n\r", ch->name);
   send_to_char(buf, victim);
   victim->pcdata->songs[SONG_MINUET] += (50 * ch->pcdata->powers[SONG_MASTERY]);
   victim->damroll += (50 * ch->pcdata->powers[SONG_MASTERY]);
   return;
  }
  else if (!str_cmp(arg1, "minne"))
  {
   if (IS_NPC(victim))
   {
    send_to_char("Not on NPCs.\n\r", ch);
    return;
   }
   if (ch->pcdata->powers[BARD_LESSONS] < 1)
   {
    send_to_char("You need to take more lessons.\n\r", ch);
    return;
   }
   if(victim->pcdata->songs[SONG_MINNE] > 0)
   {
    send_to_char("They're already affected!\n\r", ch);
    return;
   }
   sprintf(buf, "#nYou sing a wonderful #Lminne#n to %s.\n\r", victim->name);
   send_to_char(buf, ch);
   sprintf(buf, "#n%s sings a wonderful #Lminne#n to you.\n\r", ch->name);
   send_to_char(buf,victim);
   victim->pcdata->songs[SONG_MINNE] += (50 * ch->pcdata->powers[SONG_MASTERY]);
   victim->armor -= (50 * ch->pcdata->powers[SONG_MASTERY]);
   return;
  }
  else if (!str_cmp(arg1, "madrigal"))
  {
   if (IS_NPC(victim))
   {
    send_to_char("Not on NPCs.\n\r", ch);
   return;
   }
   if (ch->pcdata->powers[BARD_LESSONS] < 2)
   { 
    send_to_char("You need to take more lessons.\n\r", ch);
    return;
   }
   if (victim->pcdata->songs[SONG_MADRIGAL] > 0)
   {
    send_to_char("They're already affected!\n\r", ch);
    return;
   }
   sprintf(buf, "#nYou sing a wonderful #Gmadrigal#n to %s.\n\r", victim->name);
   send_to_char(buf, ch);
   sprintf(buf, "#n%s sings a wonderful #Gmadrigal#n to you.\n\r", ch->name);
   send_to_char(buf, victim);
   victim->pcdata->songs[SONG_MADRIGAL] += (50 * ch->pcdata->powers[SONG_MASTERY]);
   victim->hitroll += (50 * ch->pcdata->powers[SONG_MASTERY]);
   return;
  }
  else if (!str_cmp(arg1, "spiritual"))
  {
   if(ch->pcdata->powers[BARD_LESSONS] < 10)
   {
    send_to_char("You need to take more lessons.\n\r", ch);
    return;
   } 
   dam[0] = ch->pcdata->songs[0] + ch->pcdata->songs[1] + ch->pcdata->songs[2] + ch->pcdata->songs[3];
   dam[1] = ch->pcdata->songs[4] + ch->pcdata->songs[5] + ch->pcdata->songs[6] + ch->pcdata->songs[7];
   dam[2] = dam[0] + dam[1];
   dam[3] = dam[2] * 12.5;
   damage(ch, victim, dam[3], gsn_requiem);
   sprintf(buf, "#yYou channel all your #7inspiration#y into one powerful song, hitting #C%s #yincredibly hard. [#L%d#y]#n\n\r", 
   victim->name, dam[3]);
   send_to_char(buf, ch);
   sprintf(buf, "#C%s #ychannels every bit of their #7inspiration #yinto one powerful song, hitting you hard. [#L%d#y]#n\n\r", ch->name, dam[3]);
   send_to_char(buf, victim);
   WAIT_STATE(ch, 36);
   return;
  }
  else if (!str_cmp(arg1, "lullaby"))
  {
   if (IS_NPC(victim))
   {
    send_to_char("Only on PCs.\n\r", ch);
    return;
   }
   if (ch->pcdata->powers[BARD_LESSONS] < 7)
   {
    send_to_char("You need to take more lessons.\n\r", ch);
    return;
   }
   if (victim->pcdata->songs[SONG_LULLABY] > 0)
   {
    send_to_char("They're already asleep.\n\r", ch);
    return;
   }
   sprintf(buf, "#nYou sing a #0lullaby#n to %s, putting them to sleep.\n\r", victim->name);
   send_to_char(buf, ch);
   sprintf(buf, "#n%s sings a #0lullaby#n to you, putting you to sleep.\n\r", ch->name);
   send_to_char(buf, victim);
   victim->position = POS_STUNNED;
  }   
  else if (!str_cmp(arg1, "requiem"))
  {
   if (IS_NPC(victim))
   {
    send_to_char("Only on PCs.\n\r", ch);
    return;
   }
   if (ch->pcdata->powers[BARD_LESSONS] < 4)
   {
    send_to_char("You need to take more lessons.\n\r", ch);
    return;
   }
   if (victim->pcdata->songs[SONG_REQUIEM] > 0)
   {
    send_to_char("They're already suffering.\n\r", ch);
    return;
   }
   sprintf(buf, "#nYou instill within %s a horrific #rrequiem#n.\n\r", victim->name);
   send_to_char(buf, ch);
   sprintf(buf, "#n%s instills within you a horrific #rrequiem#n.\n\r", ch->name);
   send_to_char(buf, victim);
   victim->pcdata->songs[SONG_REQUIEM] += ch->pcdata->powers[SONG_MASTERY];
   return;
  }
  else if (!str_cmp(arg1, "dissonance"))
  {
   if (ch->pcdata->powers[BARD_LESSONS] < 9)
   {
    send_to_char("You need to take more lessons.\n\r", ch);
    return;
   }
   dam[0] = number_range(1, 100);
   dam[1] = number_range(5, 500);
   dam[2] = number_range(9, 900);
   dam[3] = number_range(13, 1300);
   dam[4] = number_range(17, 1700);
   damage(ch, victim, dam[0], gsn_requiem);
   damage(ch, victim, dam[1], gsn_requiem);
   damage(ch, victim, dam[2], gsn_requiem);
   damage(ch, victim, dam[3], gsn_requiem);
   damage(ch, victim, dam[4], gsn_requiem);
   sprintf(buf, "#nThe #7intrdouction#n to your dissonant rush does #y[#L%d#y]#n damage to #C%s.#n\n\r", dam[0], victim->name);
   send_to_char(buf, ch);
   sprintf(buf, "#nThe #7warmup#n to your dissonant attack does #y[#L%d#y]#n damage to #C%s.#n\n\r", dam[1], victim->name);
   send_to_char(buf, ch); 
   sprintf(buf, "#nThe #7body#n of your dissonant onslaught does #y[#L%d#y]#n damage to #C%s.#n\n\r", dam[2], victim->name);
   send_to_char(buf, ch);
   sprintf(buf, "#nThe #7outro#n to your dissonant song does #y[#L%d#y]#n damage to #C%s.#n\n\r", dam[3], victim->name);
   send_to_char(buf, ch);
   sprintf(buf, "#nThe #7aftermath#n of your attack does #y[#L%d#y]#n damage to #C%s.#n\n\r", dam[4], victim->name);
   send_to_char(buf, ch);
   sprintf(buf, "You take #y[#L%d#y]#n damage from %s's dissonant song #7introduction.#m\n\r", dam[0], ch->name);
   send_to_char(buf, victim);
   sprintf(buf, "The #7warmup#n to %s's dissonant attack does #y[#L%d#y]#n damage to you.\n\r", ch->name, dam[1]);
   send_to_char(buf, victim);
   sprintf(buf, "The #7body#n of %s's dissonant onslaught does #[#L%d#y]#n damage to you.\n\r", ch->name, dam[2]);
   send_to_char(buf, victim);
   sprintf(buf, "%s's dissonant song #7outro#n deals #y[#L%d#y]#n damage to you.\n\r", ch->name, dam[3]);
   send_to_char(buf, victim);
   sprintf(buf, "You take #y[#L%d#y]#n damage from %s's dissonant #7aftermath.#n\n\r", dam[4], ch->name);
   send_to_char(buf, victim);
   WAIT_STATE(ch, 36);
   return;
  }
  else if (!str_cmp(arg1, "paeon"))
  {
   if (IS_NPC(victim))
   {
    send_to_char("Only on PCs.\n\r", ch);
    return;
   }
   if (ch->pcdata->powers[BARD_LESSONS] < 5)
   {
    send_to_char("You need to take more lessons.\n\r", ch);
    return;
   }
   if (victim->pcdata->songs[SONG_PAEON] > 0)
   {
    send_to_char("They're regenerating quickly already.\n\r", ch);
    return;
   }
   sprintf(buf, "#nYou successfully cause %s to regenerate quickly with your #Cpaeon#n.\n\r", victim->name);
   send_to_char(buf, ch);
   sprintf(buf, "#n%s successfully causes you to regenerate quickly with their #Cpaeon#n.\n\r", ch->name);
   send_to_char(buf, victim);
   victim->pcdata->songs[SONG_PAEON] += ch->pcdata->powers[SONG_MASTERY];
   return;
  }
  else if (!str_cmp(arg1, "ballad"))
  {
   if (IS_NPC(victim))
   {
    send_to_char("Only on players.\n\r", ch);
    return;
   }
   if (ch->pcdata->powers[BARD_LESSONS] < 6)
   {
    send_to_char("You need to take more lessons.\n\r", ch);
    return;
   }
   if (victim->pcdata->songs[SONG_BALLAD] > 0)
   {
    send_to_char("They're regenerating mana fiercely already.\n\r", ch);
    return;
   }
   sprintf(buf, "#nYou cause %s to regenerate mana fiercely with your #Pballad#n.\n\r", victim->name);
   send_to_char(buf, ch);
   sprintf(buf, "#n%s causes you to regenerate mana fiercely with their #Pballad#n.\n\r", ch->name);
   send_to_char(buf, victim);
   victim->pcdata->songs[SONG_BALLAD] += ch->pcdata->powers[SONG_MASTERY];
   return;
  }
  else if (!str_cmp(arg1, "hymnus"))
  {
   if (IS_NPC(victim))
   {
    send_to_char("Only PCs.\n\r", ch);
    return;
   }
   if (ch->pcdata->powers[BARD_LESSONS] < 8)
   { 
    send_to_char("You need to take more lessons.\n\r", ch);
    return;
   }
   if (victim->pcdata->songs[SONG_HYMNUS] > 0)
   {
    send_to_char("They are already suffering from it.\n\r", ch);
    return;
   }
   sprintf(buf, "#nYou degrade %s and their ability to regenerate mana with your #7hymnus#n.\n\r", victim->name);
   send_to_char(buf, ch);
   sprintf(buf, "#n%s degrades your ability to regenerate mana with their #7hymnus#n.\n\r", victim->name);
   send_to_char(buf, victim);
   victim->pcdata->songs[SONG_HYMNUS] += ch->pcdata->powers[SONG_MASTERY];
   return;
  }
  else if (!str_cmp(arg1, "march"))
  {
   if (IS_NPC(victim))
   {
    send_to_char("Only on players.\n\r", ch);
    return;
   }
   if (ch->pcdata->powers[BARD_LESSONS] < 3)
   {
    send_to_char("You need to take more lessons.\n\r", ch);
    return;
   }
   if (victim->pcdata->songs[SONG_MARCH] > 0)
   {
    send_to_char("They're already marching!\n\r", ch);
    return;
   }
   sprintf(buf, "#nYou sing a wonderful #ymarch#n to %s\n\r", victim->name);
   send_to_char(buf, ch);
   sprintf(buf, "#n%s sings a wonderful #ymarch#n to you.\n\r", ch->name);
   send_to_char(buf, victim);
   victim->pcdata->songs[SONG_MARCH] += (ch->pcdata->powers[SONG_MASTERY]*50);
   return;
  }
 return; 
}

void do_songs(CHAR_DATA *ch, char *argument)
{
 char uta[MAX_INPUT_LENGTH];
 char buf[MAX_INPUT_LENGTH];
 int song = 0;


if (!IS_RACE(ch, RACE_ELF) && !IS_RACE(ch, RACE_WILDELF)
&& !IS_RACE(ch, RACE_HALFELF) && !IS_RACE(ch, RACE_DROW))
{
 send_to_char("Huh?\n\r", ch);
 return;
}

 for (song = 0; song < 9; song++)
 {
  switch(song)
  {
   case 0:
    sprintf(uta, "Minuet:   ");
    break;
   case 2:
    sprintf(uta, "Madrigal: ");
    break;
   case 1:
    sprintf(uta, "Minne:    ");
    break;
   case 3:
    sprintf(uta, "March:    ");
    break;
   case 4:
    sprintf(uta, "Requiem:  ");
    break;
   case 5:
    sprintf(uta, "Paeon:    ");
    break;
   case 6:
    sprintf(uta, "Ballad:   ");
    break;
   case 7:
    sprintf(uta, "Lullaby:  ");
    break;
   case 8:
    sprintf(uta, "Hymnus:   ");
    break;
  }
  sprintf(buf, "%s %d\n\r", uta, ch->pcdata->songs[song]);
  send_to_char(buf, ch);
 }
 sprintf(buf, "Mastery:   %d\n", ch->pcdata->powers[SONG_MASTERY]);
 send_to_char(buf, ch);
 return;
}

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

  if (IS_NPC (ch))
    return;

	if (!IS_CLASS (ch, RACE_TROLL) && !IS_RACE(ch, RACE_HALFTROLL)
	&& !IS_RACE(ch, RACE_ARCHANGEL) && !IS_RACE(ch, RACE_ARCHDEMON)
	&& !IS_RACE(ch, RACE_DRAGONKIND))
    {
      stc ("Huh?\n\r", ch);
      return;
    }

  if (!IS_SET (ch->newbits, NEW_TOUGHSKIN))
    {
      stc ("Your skin grows stronger.\n\r", ch);
      SET_BIT (ch->newbits, NEW_TOUGHSKIN);
    }
  else
    {
      stc ("Your skin looses its leathery texture.\n\r", ch);
      REMOVE_BIT (ch->newbits, NEW_TOUGHSKIN);

    }
return;
}

