/
roa/
roa/lib/boards/
roa/lib/config/
roa/lib/edits/
roa/lib/help/
roa/lib/misc/
roa/lib/plrobjs/
roa/lib/quests/
roa/lib/socials/
roa/lib/www/
roa/lib/www/LEDSign/
roa/lib/www/LEDSign/fonts/
roa/lib/www/LEDSign/scripts/
roa/src/s_inc/
roa/src/sclient/
roa/src/sclient/binary/
roa/src/sclient/text/
roa/src/util/
/************************************************************************
	Realms of Aurealis 		James Rhone aka Vall of RoA

monk.c					All skills/spells/functions that
					deal with the RoA original monk
					class (monshai) can be found here.

				design and concepts:  Mouseglove and co.
				code:  jtrhone aka Vall of RoA

		******** 100% Completely Original Code ********
		*** BE AWARE OF ALL RIGHTS AND RESERVATIONS ***
		******** 100% Completely Original Code ********
		        All rights reserved henceforth. 

    Please note that no guarantees are associated with any code from
Realms of Aurealis.  All code which has been released to the general
public has been done so with an 'as is' pretense.  RoA is based on both
Diku and CircleMUD and ALL licenses from both *MUST* be adhered to as well
as the RoA license.   *** Read, Learn, Understand, Improve ***
*************************************************************************/

/*
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Monshai:

Monshai are an order dedicated to control of the body by a combination of
spiritual cleansing and mental discipline.  They may be based in a monestary or
wander as their individual callings see fit.  Monshai function best when in
balance between the forces of good and evil, but when out of balance, tend to
function better when the scales are tipped to good than to evil.  Monshai are
normally very quiet, peaceful men and women, who seek only to live in harmony
with their surroundings.

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
*/

/* monshai stuff left TO DO  -8/96 roa
Curtain               8       Rank I magic/breath resistance.
Shield               17       Rank II magic/breath resistance.
Inertial Balance     20       Allows them to "walk on water".
Barrier              37       Rank III magic/breath resistance.
Wall                 59       Rank IV magic/breath resistance.
Sanctum              60       Make current room their sanctum.
Astral Walk          60       Move whole group to Sanctum instantly.
Quivering Palm       65       Rank I attack ability.

*only works in rooms flagged PEACEFUL.

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

Full descriptions.
==================
(Note: I'm only going to worry about the new ones, or the ones that are changed
from their current form. =)

Curtain - Gives them a +1 to resist all magic/breath attacks.

Shield - Gives them a +2 to resist magic/breath attacks.

Inertial Balance: This allows them to "walk" into both swim and no_swim water
                  rooms.

Discern: This is a concentration based identify skill.  It should have a 
	 %chance of failure equal to 100-lvl of character.

Barrier - Gives them a +3 to resist magic/breath attacks.

Wall - Gives them a +5 to resist magic/breath attacks.

Sanctum: Allows them to pick any room (in a hometown or the pc house zone) as
         their private sanctum.  This can be changed at any time, but they have
         to be in the room to set it. (Like the settle command).

Astral Walk: Allows the monshai and anyone who is grouped with him/her to be
             mentally shifted through astral projection to the monshai's
             sanctum.

Quivering Palm:  This is an attack that, if successful, will kill any creature
                 lower level then the monshai in one hit, or stun and damage it
                 if unsuccessful/higher level than the monshai.  Set it up
                 something like this:

                 The chance of success IF the pc is equal or higher level:
                 (PCLvl - MobLvl) + 10 = % chance of success.
                    If successful, mob is set to 0 hit points.
                    If unsuccessful, mob takes:
                      (PCLvl/5)d10+(PCLvl) damage and is stunned for 5 rounds.

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

Skill               Lvl  Cost:     Duration:      Effect:
=====               ===  =====     =========      =======
Curtain              8     10      Lvl/2 hours    Self only
Shield              17     25      Lvl/2 hours    Self only
Inertial Balance    20     30      Lvl/3 hours    Self only
Barrier             37     40      Lvl/2 hours    Self only
Wall                58     65      Lvl/2 hours    Self only
Sanctum             61     50      Instant        Current Room
Astral Walk         61    150      Instant        Self/Group
Quivering Palm      65    200      Instant        1 mob/pc

*/

#include "conf.h"
#include "sysdep.h"

#include "structures.h"
#include "utils.h"
#include "comm.h"
#include "interpreter.h"
#include "acmd.h"
#include "handler.h"
#include "db.h"
#include "roaolc.h"
#include "magic.h"
#include "affect.h"
#include "fight.h"
#include "lists.h"

ACMD(do_aura)
{
  chdata *vict = NULL;
  char align[100];
  char *argu = argument;

  if (!IS_MONK(ch))
  {
    send_to_char("Only those members of the Monshai class know of such a skill.\n\r",ch);
    return;
  }

  if (!GET_SKILL(ch, SKILL_AURA))
  {
    send_to_char("You know not of that skill yet, Monshai.\n\r",ch);
    return;
  }

  if (!*argu) 
  {
    send_to_char("You must supply a target whose aura you wish to detect.\n\r",
		 ch);
    return;
  }

  skip_spaces(&argu);
  if (!(vict = get_char_room_vis(ch, argu)))
  {
    send_to_char("Your target is nowhere to be found.\n\r",ch);
    return;
  }

  if (GET_MANA(ch) < 5)
  {
    send_to_char("You feel too weak to do such, Monshai.\n\r",ch);
    return;
  }
  GET_MANA(ch) -= 5;

  if (GET_SKILL(ch, SKILL_AURA) < number(1, 101))
  {
    act("$N's aura confuses you.", FALSE, ch, 0, vict, TO_CHAR);
    return;
  }

  if (GET_ALIGNMENT(vict) >= 900)
    strcpy(align, "%BHoly%0");
  else
  if (GET_ALIGNMENT(vict) > 400)
    strcpy(align, "%6Good%0");
  else
  if (GET_ALIGNMENT(vict) > -400)
    strcpy(align, "Neutral");
  else
  if (GET_ALIGNMENT(vict) > -900)
    strcpy(align, "%1Evil%0");
  else
  if (GET_ALIGNMENT(vict) <= -900)
    strcpy(align, "%1Demonic%0");

  act("$N is briefly covered by a %Bstrange aura%0!", TRUE,ch, 0, vict, TO_ROOM);
  act("$n looks into your heart!", TRUE, ch, 0, vict, TO_VICT);
  sprintf(buf, "$N's aura seems to be %s.", align);
  act(buf, FALSE, ch, 0, vict, TO_CHAR); 
}

ACMD(do_snarl)
{
  chdata *vict = NULL;

  if (!IS_MONK(ch))
  {
    send_to_char("Only those members of the Monshai class know of such a skill.\n\r",ch);
    return;
  }

  if (!GET_SKILL(ch, SKILL_SNARL))
  {
    send_to_char("You know not of that skill yet, Monshai.\n\r",ch);
    return;
  }

  if (!(vict = FIGHTING(ch))) 
  {
    send_to_char("Such a skill works better while fighting, Monshai.\n\r",ch);
    return;
  }

  if (!SAME_ROOM(ch, vict))
  {
    send_to_char("Your target has fled!\n\r",ch);
    return;
  }
  
  if (!check_truce(ch, vict))
    return;
  if (!check_mortal_combat(ch, vict))
    return;

  if (GET_MANA(ch) < 35)
  {
    send_to_char("You feel too weak to do such, Monshai.\n\r",ch);
    return;
  }
  GET_MANA(ch) -= 35;

  act("You %Bsnarl%0 at $N!", FALSE, ch, 0, vict, TO_CHAR);
  act("$n %Bsnarls%0 at you!", FALSE, ch, 0, vict, TO_VICT);
  if (GET_SKILL(ch, SKILL_SNARL) < number(1, 101))
  {
    act("$N %Bscreams%0 back at you in defiance!", FALSE, ch, 0, vict,TO_CHAR);
    act("You %Bscream%0 back at $m in defiance!", FALSE, ch, 0, vict,TO_VICT);
    act("$N laughs at $n's attempt to frighten $M!", FALSE, ch, 0, vict, TO_ROOM);
    return;
  }
  else
  if (!number(0, 1))
  {
    act("Your %Bsnarl%0 %4chills%0 $N to the bone!", FALSE, ch, 0,vict,TO_CHAR);
    act("$n's %Bsnarl%0 %4chills%0 you to the bone!", FALSE, ch, 0, vict,TO_VICT);
    act("$N looks frightened as $n %Bsnarls%0!", FALSE, ch, 0, vict, TO_ROOM);
    do_flee(vict,"",0,0);
  }
}

ACMD(do_sense)
{
  if (IN_NOWHERE(ch)) return;

  if (!IS_MONK(ch))
  {
    send_to_char("Only those members of the Monshai class know of such a skill.\n\r",ch);
    return;
  }

  if (!GET_SKILL(ch, SKILL_SENSE))
  {
    send_to_char("You know not of that skill yet, Monshai.\n\r",ch);
    return;
  }

  if (GET_MANA(ch) < 5)
  {
    send_to_char("You feel too weak to do such, Monshai.\n\r",ch);
    return;
  }
  GET_MANA(ch) -= 5;

  if (GET_SKILL(ch, SKILL_SENSE) < number(1, 101))
  {
    act("This area confuses you.", FALSE, ch, 0, 0, TO_CHAR);
    return;
  }

  act("$n lowers $s head in concentration.", TRUE, ch, 0, 0, TO_ROOM);
  if (ROOM_FLAGGED(ch->in_room, PEACEFUL))
    act("You sense %Bpeace%0 throughout this area.", TRUE, ch, 0, 0, TO_CHAR);
  else
    act("You sense %1violence%0 around this area.", TRUE, ch, 0, 0, TO_CHAR);
}

/*
Cleansing: Confers an inability to be poisoned.  It won't remove poison if
           they're already sick, but it will stop them from GETTING poisoned.
Cleansing            9     20      Lvl/4 hours    Self only
*/
ACMD(do_cleanse)
{
  struct affected_type af;

  if (IN_NOWHERE(ch)) return;

  if (!IS_MONK(ch))
  {
    send_to_char("Only those members of the Monshai class know of such a skill.\n\r",ch);
    return;
  }

  if (!GET_SKILL(ch, SKILL_CLEANSE))
  {
    send_to_char("You know not of that skill yet, Monshai.\n\r",ch);
    return;
  }

  if (GET_MANA(ch) < 20)
  {
    send_to_char("You feel too weak to do such, Monshai.\n\r",ch);
    return;
  }
  GET_MANA(ch) -= 20;

  if (GET_SKILL(ch, SKILL_CLEANSE) < number(1, 101))
  {
    act("You lose your concentration.", FALSE, ch, 0, 0, TO_CHAR);
    return;
  }

  act("$n lowers $s head in concentration.", TRUE, ch, 0, 0, TO_ROOM);

   if (!affected_by_spell(ch, SKILL_CLEANSE)) 
   {
      af.type      = SKILL_CLEANSE;
      af.duration  = GET_LEVEL(ch)/4;
      af.modifier  = 0;
      af.location  = APPLY_NONE;
      af.bitvector = 0;
      af.bitvector2 = 0;

      affect_to_char(ch, &af);
      act("You concentrate on protecting yourself against impurities!",
	  FALSE, ch, 0,0, TO_CHAR);
      act("$n protects $mself against impurities!", FALSE, ch, 0, 0,TO_ROOM);
   }
   else
     act("You are already protected from impurities!", FALSE, ch, 0, 0,TO_CHAR); 
}

/*
Hasten Self: A three-round, self only haste skill which simulates the effects
             of the spell of the same name.
Hasten Self         40     55      level/20   Self only
*/
ACMD(do_hasten)
{
  struct affected_type af;

  if (IN_NOWHERE(ch)) return;

  if (!IS_MONK(ch))
  {
    send_to_char("Only those members of the Monshai class know of such a skill.\n\r",ch);
    return;
  }

  if (!GET_SKILL(ch, SKILL_HASTEN))
  {
    send_to_char("You know not of that skill yet, Monshai.\n\r",ch);
    return;
  }

  if (GET_MANA(ch) < 55)
  {
    send_to_char("You feel too weak to do such, Monshai.\n\r",ch);
    return;
  }
  GET_MANA(ch) -= 55;

  if (GET_SKILL(ch, SKILL_HASTEN) < number(1, 101))
  {
    act("You lose your concentration.", FALSE, ch, 0, 0, TO_CHAR);
    return;
  }

  act("$n lowers $s head in concentration.", TRUE, ch, 0, 0, TO_ROOM);

   if (!affected_by_spell(ch, SKILL_HASTEN) && !affected_by_spell(ch, SPELL_HASTE)) 
   {
      af.type      = SKILL_HASTEN;
      af.duration  = GET_LEVEL(ch)/20;
      af.modifier  = 0;
      af.location  = APPLY_NONE;
      af.bitvector = AFF_HASTE;
      af.bitvector2 = 0;

      affect_to_char(ch, &af);
      act("You concentrate on quickening your reactions!", FALSE, ch, 0,0, TO_CHAR);
      act("$n hastens $mself!", FALSE, ch, 0, 0, TO_ROOM);
   }
   else
     act("You are already hastened!", FALSE, ch, 0, 0, TO_CHAR); 
}

/*
Rank III skills: turtle shell - Lowers the monshai's ac by 3d4+(lvl/5).
Turtle Shell        50     65      Lvl/2 hours    Self only
*/
ACMD(do_turtle)
{
  struct affected_type af;

  if (IN_NOWHERE(ch)) return;

  if (!IS_MONK(ch))
  {
    send_to_char("Only those members of the Monshai class know of such a skill.\n\r",ch);
    return;
  }

  if (!GET_SKILL(ch, SKILL_TURTLE))
  {
    send_to_char("You know not of that skill yet, Monshai.\n\r",ch);
    return;
  }

  if (GET_MANA(ch) < 65)
  {
    send_to_char("You feel too weak to do such, Monshai.\n\r",ch);
    return;
  }
  GET_MANA(ch) -= 65;

  if (GET_SKILL(ch, SKILL_TURTLE) < number(1, 101))
  {
    act("You lose your concentration.", FALSE, ch, 0, 0, TO_CHAR);
    return;
  }

  act("$n lowers $s head in concentration.", TRUE, ch, 0, 0, TO_ROOM);

   if (!affected_by_spell(ch, SKILL_TURTLE)) 
   {
      af.type      = SKILL_TURTLE;
      af.duration  = GET_LEVEL(ch)/2;
      af.modifier  = -dice(3, 4)-(GET_LEVEL(ch)/5);
      af.location  = APPLY_AC;
      af.bitvector = 0;
      af.bitvector2 = 0;

      affect_to_char(ch, &af);
      act("You concentrate on defending yourself!", FALSE, ch, 0, 0, TO_CHAR);
      act("$n seems more nimble!", FALSE, ch, 0, 0, TO_ROOM);
   }
   else
     act("You are already using that defense technique!", FALSE, ch, 0, 0, TO_CHAR); 
}

/*
Rank III skills: Fox Flip - Lowers the monshai's ac by 2d4+(lvl/6).
Fox Flip            28     40      Lvl/2 hours    Self only
*/
ACMD(do_flip)
{
  struct affected_type af;

  if (IN_NOWHERE(ch)) return;

  if (!IS_MONK(ch))
  {
    send_to_char("Only those members of the Monshai class know of such a skill.\n\r",ch);
    return;
  }

  if (!GET_SKILL(ch, SKILL_FLIP))
  {
    send_to_char("You know not of that skill yet, Monshai.\n\r",ch);
    return;
  }

  if (GET_MANA(ch) < 40)
  {
    send_to_char("You feel too weak to do such, Monshai.\n\r",ch);
    return;
  }
  GET_MANA(ch) -= 40;

  if (GET_SKILL(ch, SKILL_FLIP) < number(1, 101))
  {
    act("You lose your concentration.", FALSE, ch, 0, 0, TO_CHAR);
    return;
  }

  act("$n lowers $s head in concentration.", TRUE, ch, 0, 0, TO_ROOM);

   if (!affected_by_spell(ch, SKILL_FLIP)) 
   {
      af.type      = SKILL_FLIP;
      af.duration  = GET_LEVEL(ch)/2;
      af.modifier  = -dice(2, 4)-(GET_LEVEL(ch)/6);
      af.location  = APPLY_AC;
      af.bitvector = 0;
      af.bitvector2 = 0;

      affect_to_char(ch, &af);
      act("You concentrate on defending yourself!", FALSE, ch, 0, 0, TO_CHAR);
      act("$n seems more nimble!", FALSE, ch, 0, 0, TO_ROOM);
   }
   else
     act("You are already using that defense technique!", FALSE, ch, 0, 0, TO_CHAR); 
}

/*
Rank II skills: Cheetah Leap - Lowers the monshai's ac by 1d6+(lvl/8).
Cheetah Leap        10     25      Lvl/2 hours    Self only
*/
ACMD(do_leap)
{
  struct affected_type af;

  if (IN_NOWHERE(ch)) return;

  if (!IS_MONK(ch))
  {
    send_to_char("Only those members of the Monshai class know of such a skill.\n\r",ch);
    return;
  }

  if (!GET_SKILL(ch, SKILL_LEAP))
  {
    send_to_char("You know not of that skill yet, Monshai.\n\r",ch);
    return;
  }

  if (GET_MANA(ch) < 25)
  {
    send_to_char("You feel too weak to do such, Monshai.\n\r",ch);
    return;
  }
  GET_MANA(ch) -= 25;

  if (GET_SKILL(ch, SKILL_LEAP) < number(1, 101))
  {
    act("You lose your concentration.", FALSE, ch, 0, 0, TO_CHAR);
    return;
  }

  act("$n lowers $s head in concentration.", TRUE, ch, 0, 0, TO_ROOM);

   if (!affected_by_spell(ch, SKILL_LEAP)) 
   {
      af.type      = SKILL_LEAP;
      af.duration  = GET_LEVEL(ch)/2;
      af.modifier  = -dice(1, 6)-(GET_LEVEL(ch)/8);
      af.location  = APPLY_AC;
      af.bitvector = 0;
      af.bitvector2 = 0;

      affect_to_char(ch, &af);
      act("You concentrate on defending yourself!", FALSE, ch, 0, 0, TO_CHAR);
      act("$n seems more nimble!", FALSE, ch, 0, 0, TO_ROOM);
   }
   else
     act("You are already using that defense technique!", FALSE, ch, 0, 0, TO_CHAR); 
}

/*
Rank I skills: Rabbit Roll - This is a low powered armor-type skill that 
allows the monshai to lower his ac by 1d4+(lvl/10).
Rabbit Roll          2     10      Lvl/2 hours    Self only
*/
ACMD(do_roll)
{
  struct affected_type af;

  if (IN_NOWHERE(ch)) return;

  if (!IS_MONK(ch))
  {
    send_to_char("Only those members of the Monshai class know of such a skill.\n\r",ch);
    return;
  }

  if (!GET_SKILL(ch, SKILL_ROLL))
  {
    send_to_char("You know not of that skill yet, Monshai.\n\r",ch);
    return;
  }

  if (GET_MANA(ch) < 10)
  {
    send_to_char("You feel too weak to do such, Monshai.\n\r",ch);
    return;
  }
  GET_MANA(ch) -= 10;

  if (GET_SKILL(ch, SKILL_ROLL) < number(1, 101))
  {
    act("You lose your concentration.", FALSE, ch, 0, 0, TO_CHAR);
    return;
  }

  act("$n lowers $s head in concentration.", TRUE, ch, 0, 0, TO_ROOM);

   if (!affected_by_spell(ch, SKILL_ROLL)) 
   {
      af.type      = SKILL_ROLL;
      af.duration  = GET_LEVEL(ch)/2;
      af.modifier  = -dice(1, 4)-(GET_LEVEL(ch)/10);
      af.location  = APPLY_AC;
      af.bitvector = 0;
      af.bitvector2 = 0;

      affect_to_char(ch, &af);
      act("You concentrate on defending yourself!", FALSE, ch, 0, 0, TO_CHAR);
      act("$n seems more nimble!", FALSE, ch, 0, 0, TO_ROOM);
   }
   else
     act("You are already using that defense technique!", FALSE, ch, 0, 0, TO_CHAR); 
}

/*
Rank IV skills: Lightning Fist - Adds 5 points to damroll while in effect.
Lightning Fist      52     65      Lvl/2 rounds   Self only
*/
ACMD(do_fist)
{
  struct affected_type af;

  if (IN_NOWHERE(ch)) return;

  if (!IS_MONK(ch))
  {
    send_to_char("Only those members of the Monshai class know of such a skill.\n\r",ch);
    return;
  }

  if (!GET_SKILL(ch, SKILL_FIST))
  {
    send_to_char("You know not of that skill yet, Monshai.\n\r",ch);
    return;
  }

  if (GET_MANA(ch) < 65)
  {
    send_to_char("You feel too weak to do such, Monshai.\n\r",ch);
    return;
  }
  GET_MANA(ch) -= 65;

  if (GET_SKILL(ch, SKILL_FIST) < number(1, 101))
  {
    act("You lose your concentration.", FALSE, ch, 0, 0, TO_CHAR);
    return;
  }

  act("$n lowers $s head in concentration.", TRUE, ch, 0, 0, TO_ROOM);

   if (!affected_by_spell(ch, SKILL_FIST))
   {
      af.type      = SKILL_FIST;
      af.duration  = GET_LEVEL(ch)/2;
      af.modifier  = 5;
      af.location  = APPLY_DAMROLL;
      af.bitvector = 0;
      af.bitvector2 = 0;

      affect_to_char(ch, &af);
      act("You concentrate on hitting harder!", FALSE, ch, 0, 0, TO_CHAR);
      act("$n suddenly looks more dangerous!", FALSE, ch, 0, 0, TO_ROOM);
   }
   else
     act("You're already concentrating on fist of lightning!", FALSE, ch,0, 0,TO_CHAR);
}

// Iron Hand - This adds 3 points to the damroll while in effect.
// Iron Hand           31     40      Lvl/2 rounds   Self only
ACMD(do_ironhand)
{
  struct affected_type af;

  if (IN_NOWHERE(ch)) return;

  if (!IS_MONK(ch))
  {
    send_to_char("Only those members of the Monshai class know of such a skill.\n\r",ch);
    return;
  }

  if (!GET_SKILL(ch, SKILL_IRONHAND))
  {
    send_to_char("You know not of that skill yet, Monshai.\n\r",ch);
    return;
  }

  if (GET_MANA(ch) < 40)
  {
    send_to_char("You feel too weak to do such, Monshai.\n\r",ch);
    return;
  }
  GET_MANA(ch) -= 40;

  if (GET_SKILL(ch, SKILL_IRONHAND) < number(1, 101))
  {
    act("You lose your concentration.", FALSE, ch, 0, 0, TO_CHAR);
    return;
  }

  act("$n lowers $s head in concentration.", TRUE, ch, 0, 0, TO_ROOM);

   if (!affected_by_spell(ch, SKILL_IRONHAND))
   {
      af.type      = SKILL_IRONHAND;
      af.duration  = GET_LEVEL(ch)/2;
      af.modifier  = 3;
      af.location  = APPLY_DAMROLL;
      af.bitvector = 0;
      af.bitvector2 = 0;

      affect_to_char(ch, &af);
      act("You concentrate on hitting harder!", FALSE, ch, 0, 0, TO_CHAR);
      act("$n suddenly looks more dangerous!", FALSE, ch, 0, 0, TO_ROOM);
   }
   else
     act("You're already concentrating on iron hands!", FALSE, ch,0,0,TO_CHAR);
}

/*
Stone Finger - This adds 2 points to the damroll while in effect.
Stone Finger        12     25      Lvl/2 rounds   Self only
*/
ACMD(do_stone)
{
  struct affected_type af;

  if (IN_NOWHERE(ch)) return;

  if (!IS_MONK(ch))
  {
    send_to_char("Only those members of the Monshai class know of such a skill.\n\r",ch);
    return;
  }

  if (!GET_SKILL(ch, SKILL_STONE_FINGER))
  {
    send_to_char("You know not of that skill yet, Monshai.\n\r",ch);
    return;
  }

  if (GET_MANA(ch) < 25)
  {
    send_to_char("You feel too weak to do such, Monshai.\n\r",ch);
    return;
  }
  GET_MANA(ch) -= 25;

  if (GET_SKILL(ch, SKILL_STONE_FINGER) < number(1, 101))
  {
    act("You lose your concentration.", FALSE, ch, 0, 0, TO_CHAR);
    return;
  }

  act("$n lowers $s head in concentration.", TRUE, ch, 0, 0, TO_ROOM);

   if (!affected_by_spell(ch, SKILL_STONE_FINGER))
   {
      af.type      = SKILL_STONE_FINGER;
      af.duration  = GET_LEVEL(ch)/2;
      af.modifier  = 2;
      af.location  = APPLY_DAMROLL;
      af.bitvector = 0;
      af.bitvector2 = 0;

      affect_to_char(ch, &af);
      act("You concentrate on hitting harder!", FALSE, ch, 0, 0, TO_CHAR);
      act("$n suddenly looks more dangerous!", FALSE, ch, 0, 0, TO_ROOM);
   }
   else
     act("You're already concentrating on stone finger!", FALSE, ch, 0, 0,TO_CHAR);
}

/*
Razor Nail - This adds 1 point to the damroll while in effect.
Razor Nail           3     10      Lvl/2 rounds   Self only
*/
ACMD(do_razor)
{
  struct affected_type af;

  if (IN_NOWHERE(ch)) return;

  if (!IS_MONK(ch))
  {
    send_to_char("Only those members of the Monshai class know of such a skill.\n\r",ch);
    return;
  }

  if (!GET_SKILL(ch, SKILL_RAZOR))
  {
    send_to_char("You know not of that skill yet, Monshai.\n\r",ch);
    return;
  }

  if (GET_MANA(ch) < 10)
  {
    send_to_char("You feel too weak to do such, Monshai.\n\r",ch);
    return;
  }
  GET_MANA(ch) -= 10;

  if (GET_SKILL(ch, SKILL_RAZOR) < number(1, 101))
  {
    act("You lose your concentration.", FALSE, ch, 0, 0, TO_CHAR);
    return;
  }

  act("$n lowers $s head in concentration.", TRUE, ch, 0, 0, TO_ROOM);

   if (!affected_by_spell(ch, SKILL_RAZOR))
   {
      af.type      = SKILL_RAZOR;
      af.duration  = GET_LEVEL(ch)/2;
      af.modifier  = 1;
      af.location  = APPLY_DAMROLL;
      af.bitvector = 0;
      af.bitvector2 = 0;

      affect_to_char(ch, &af);
      act("You concentrate on hitting sharply!", FALSE, ch, 0, 0, TO_CHAR);
      act("$n suddenly looks more dangerous!", FALSE, ch, 0, 0, TO_ROOM);
   }
   else
     act("You're already hitting sharply!", FALSE, ch, 0, 0, TO_CHAR);
}

/*
Levitation: This is equivilent to the pixie's ability to float.  It's not
	    flight, but it will allow them to move into flight only areas.
Levitation          19     30      Lvl/3 hours    Self only
*/
ACMD(do_levitate)
{
  struct affected_type af;

  if (IN_NOWHERE(ch)) return;

  if (!IS_MONK(ch))
  {
    send_to_char("Only those members of the Monshai class know of such a skill.\n\r",ch);
    return;
  }

  if (!GET_SKILL(ch, SKILL_LEVITATE))
  {
    send_to_char("You know not of that skill yet, Monshai.\n\r",ch);
    return;
  }

  if (GET_MANA(ch) < 30)
  {
    send_to_char("You feel too weak to do such, Monshai.\n\r",ch);
    return;
  }
  GET_MANA(ch) -= 30;

  if (GET_SKILL(ch, SKILL_LEVITATE) < number(1, 101))
  {
    act("You lose your concentration.", FALSE, ch, 0, 0, TO_CHAR);
    return;
  }

  act("$n lowers $s head in concentration.", TRUE, ch, 0, 0, TO_ROOM);

   if (!IS_AFFECTED(ch, AFF_WINGS))
   {
      af.type      = SKILL_LEVITATE;
      af.duration  = GET_LEVEL(ch)/3;
      af.modifier  = 0;
      af.location  = APPLY_NONE;
      af.bitvector = AFF_WINGS;
      af.bitvector2 = 0;

      affect_to_char(ch, &af);
      act("You concentrate on floating!", FALSE, ch, 0, 0, TO_CHAR);
      act("$n suddenly levitates!", FALSE, ch, 0, 0, TO_ROOM);
   }
   else
     act("You're already affected by wings!", FALSE, ch, 0, 0, TO_CHAR);
}

/*
                Trance - In a peaceful room, doubles regen.
Trance *            56     65      Lvl/2 rounds   Self only
*/
ACMD(do_trance)
{
  struct affected_type af;

  if (IN_NOWHERE(ch)) return;

  if (!IS_MONK(ch))
  {
    send_to_char("Only those members of the Monshai class know of such a skill.\n\r",ch);
    return;
  }

  if (!GET_SKILL(ch, SKILL_TRANCE))
  {
    send_to_char("You know not of that skill yet, Monshai.\n\r",ch);
    return;
  }

  if (!ROOM_FLAGGED(ch->in_room, PEACEFUL))
  {
    send_to_char("There is too much violence surrounding you for meditation.\n\r",ch);
    return;
  }

  if (GET_MANA(ch) < 65)
  {
    send_to_char("You feel too weak to do such, Monshai.\n\r",ch);
    return;
  }
  GET_MANA(ch) -= 65;

  if (GET_SKILL(ch, SKILL_TRANCE) < number(1, 101))
  {
    act("You lose your concentration.", FALSE, ch, 0, 0, TO_CHAR);
    return;
  }

  act("$n lowers $s head in concentration.", TRUE, ch, 0, 0, TO_ROOM);

   if (!affected_by_spell(ch, SKILL_TRANCE))
   {
      af.type      = SKILL_TRANCE;
      af.duration  = GET_LEVEL(ch)/2;
      af.modifier  = 0;
      af.location  = APPLY_NONE;
      af.bitvector = 0;
      af.bitvector2 = 0;

      affect_to_char(ch, &af);
      act("You concentrate on regeneration!", FALSE, ch, 0, 0, TO_CHAR);
      act("$n slips into a %4deep%0 state of meditation.", FALSE, ch, 0,0, TO_ROOM);
   }
   else
     act("You're already in that state of meditation!", FALSE, ch, 0, 0, TO_CHAR); 
}

/*
Wa *                34     40      Lvl/2 rounds   Self only
                 Wa - In a peaceful room, ups regen by 175%.
*/
ACMD(do_wa)
{
  struct affected_type af;

  if (IN_NOWHERE(ch)) return;

  if (!IS_MONK(ch))
  {
    send_to_char("Only those members of the Monshai class know of such a skill.\n\r",ch);
    return;
  }

  if (!GET_SKILL(ch, SKILL_WA))
  {
    send_to_char("You know not of that skill yet, Monshai.\n\r",ch);
    return;
  }

  if (!ROOM_FLAGGED(ch->in_room, PEACEFUL))
  {
    send_to_char("There is too much violence surrounding you for meditation.\n\r",ch);
    return;
  }

  if (GET_MANA(ch) < 40)
  {
    send_to_char("You feel too weak to do such, Monshai.\n\r",ch);
    return;
  }
  GET_MANA(ch) -= 40;

  if (GET_SKILL(ch, SKILL_WA) < number(1, 101))
  {
    act("You lose your concentration.", FALSE, ch, 0, 0, TO_CHAR);
    return;
  }

  act("$n lowers $s head in concentration.", TRUE, ch, 0, 0, TO_ROOM);

   if (!affected_by_spell(ch, SKILL_WA))
   {
      af.type      = SKILL_WA;
      af.duration  = GET_LEVEL(ch)/2;
      af.modifier  = 0;
      af.location  = APPLY_NONE;
      af.bitvector = 0;
      af.bitvector2 = 0;

      affect_to_char(ch, &af);
      act("You concentrate on regeneration!", FALSE, ch, 0, 0, TO_CHAR);
      act("$n slips into a state of meditation.", FALSE, ch, 0, 0, TO_ROOM);
   }
   else
     act("You're already in that state of meditation!", FALSE, ch, 0, 0, TO_CHAR); 
}

/*
150% regen if aff by Mok and in peaceful room 
Mok *               15     25      Lvl/2 rounds   Self only
*/
ACMD(do_mok)
{
  struct affected_type af;

  if (IN_NOWHERE(ch)) return;

  if (!IS_MONK(ch))
  {
    send_to_char("Only those members of the Monshai class know of such a skill.\n\r",ch);
    return;
  }

  if (!GET_SKILL(ch, SKILL_MOK))
  {
    send_to_char("You know not of that skill yet, Monshai.\n\r",ch);
    return;
  }

  if (!ROOM_FLAGGED(ch->in_room, PEACEFUL))
  {
    send_to_char("There is too much violence surrounding you for meditation.\n\r",ch);
    return;
  }

  if (GET_MANA(ch) < 25)
  {
    send_to_char("You feel too weak to do such, Monshai.\n\r",ch);
    return;
  }
  GET_MANA(ch) -= 25;

  if (GET_SKILL(ch, SKILL_MOK) < number(1, 101))
  {
    act("You lose your concentration.", FALSE, ch, 0, 0, TO_CHAR);
    return;
  }

  act("$n lowers $s head in concentration.", TRUE, ch, 0, 0, TO_ROOM);

   if (!affected_by_spell(ch, SKILL_MOK))
   {
      af.type      = SKILL_MOK;
      af.duration  = GET_LEVEL(ch)/2;
      af.modifier  = 0;
      af.location  = APPLY_NONE;
      af.bitvector = 0;
      af.bitvector2 = 0;

      affect_to_char(ch, &af);
      act("You concentrate on regeneration!", FALSE, ch, 0, 0, TO_CHAR);
      act("$n slips into a state of meditation.", FALSE, ch, 0, 0, TO_ROOM);
   }
   else
     act("You're already in that state of meditation!", FALSE, ch, 0, 0, TO_CHAR); 
}

/*
125% regen if aff by Mok and in peaceful room 
Om *               15     25      Lvl/2 rounds   Self only
*/
ACMD(do_om)
{
  struct affected_type af;

  if (IN_NOWHERE(ch)) return;

  if (!IS_MONK(ch))
  {
    send_to_char("Only those members of the Monshai class know of such a skill.\n\r",ch);
    return;
  }

  if (!GET_SKILL(ch, SKILL_OM))
  {
    send_to_char("You know not of that skill yet, Monshai.\n\r",ch);
    return;
  }

  if (!ROOM_FLAGGED(ch->in_room, PEACEFUL))
  {
    send_to_char("There is too much violence surrounding you for meditation.\n\r",ch);
    return;
  }

  if (GET_MANA(ch) < 15)
  {
    send_to_char("You feel too weak to do such, Monshai.\n\r",ch);
    return;
  }
  GET_MANA(ch) -= 15;

  if (GET_SKILL(ch, SKILL_OM) < number(1, 101))
  {
    act("You lose your concentration.", FALSE, ch, 0, 0, TO_CHAR);
    return;
  }

  act("$n lowers $s head in concentration.", TRUE, ch, 0, 0, TO_ROOM);

   if (!affected_by_spell(ch, SKILL_OM))
   {
      af.type      = SKILL_OM;
      af.duration  = GET_LEVEL(ch)/2;
      af.modifier  = 0;
      af.location  = APPLY_NONE;
      af.bitvector = 0;
      af.bitvector2 = 0;

      affect_to_char(ch, &af);
      act("You concentrate on regeneration!", FALSE, ch, 0, 0, TO_CHAR);
      act("$n slips into a state of meditation.", FALSE, ch, 0, 0, TO_ROOM);
   }
   else
     act("You're already in that state of meditation!", FALSE, ch, 0, 0, TO_CHAR); 
}

/*
Iron Skin           46     60      Lvl/2 rounds   Self only
Iron Skin            46       Lowered versin of Stone Skin.
equiv to armor now 8/5/98 -jtrhone
*/
ACMD(do_iron)
{
  struct affected_type af;

  if (IN_NOWHERE(ch)) return;

  if (!IS_MONK(ch))
  {
    send_to_char("Only those members of the Monshai class know of such a skill.\n\r",ch);
    return;
  }

  if (!GET_SKILL(ch, SKILL_IRON))
  {
    send_to_char("You know not of that skill yet, Monshai.\n\r",ch);
    return;
  }

  if (GET_MANA(ch) < 60)
  {
    send_to_char("You feel too weak to do such, Monshai.\n\r",ch);
    return;
  }
  GET_MANA(ch) -= 60;

  if (GET_SKILL(ch, SKILL_IRON) < number(1, 101))
  {
    act("You lose your concentration.", FALSE, ch, 0, 0, TO_CHAR);
    return;
  }

  act("$n lowers $s head in concentration.", TRUE, ch, 0, 0, TO_ROOM);

   if (!affected_by_spell(ch, SKILL_IRON))
   {
      af.type      = SKILL_IRON;
      af.duration  = 24;
      af.modifier  = -GET_LEVEL(ch);
      af.location  = APPLY_AC;
      af.bitvector = 0;
      af.bitvector2 = 0;

      affect_to_char(ch, &af);
      act("You concentrate on hardening your skin!", FALSE, ch, 0, 0, TO_CHAR);
      act("$n suddenly looks more defensive.", FALSE, ch, 0, 0, TO_ROOM);
   }
   else
     act("You're already affected by iron skin!", FALSE, ch, 0, 0,TO_CHAR); 
}