legend/
legend/area/
legend/player/
/***************************************************************************
 *  God Wars Mud copyright (C) 1994, 1995, 1996 by Richard Woolcock        *
 *                                                                         *
 *  Legend of Chrystancia copyright (C) 1999, 2000, 2001 by Matthew Little *
 *  This mud is NOT to be copied in whole or in part, or to be run without *
 *  the permission of Matthew Little. Nobody else has permission to        *
 *  authorise the use of this code.                                        *
 ***************************************************************************/

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

void do_chistorm (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *vch;
   CHAR_DATA *vch_next;

   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_MONK))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (ch->chi[MAXIMUM] < 6)
   {
      send_to_char
	 ("You need to attain level 6 chi before you can use chistorm\n\r",
	  ch);
      return;
   }
   if (ch->move < 10000)
   {
      stc ("You need 10,000 move to use chistorm!\n\r", ch);
      return;
   }
   if (ch->chi[CURRENT] > 0)
   {
      send_to_char
	 ("You need to relax your chi before you can use chistorm\n\r", ch);
      return;
   }
   else
   {
      send_to_char
	 ("You focus your mental energies and explode in a chistorm!\n\r",
	  ch);
      act ("$n explodes in a chistorm!\n\r", ch, NULL, NULL, TO_ROOM);
      ch->chi[CURRENT] += 6;
//      do_berserk(ch, "");
      ch->move -= 10000;
      WAIT_STATE (ch, 6);
//new bit
      for (vch = char_list; vch != NULL; vch = vch_next)
      {
	 vch_next = vch->next;
	 if (vch->in_room == NULL)
	    continue;
	 if (ch == vch)
	 {
	    act ("You explode in a chistorm!", ch, NULL, NULL, TO_CHAR);
	    continue;
	 }
	 if (!IS_NPC (vch) && vch->pcdata->chobj != NULL)
	    continue;
	 if (!IS_NPC (vch))
	 {
	    if (vch->in_room == ch->in_room)
	       act ("$n focuses $s mental energies and explodes in a chistorm!", ch, NULL, vch, TO_VICT);
	    else if (!CAN_PK (vch))
	       continue;
	 }
	 if (vch->in_room == ch->in_room && can_see (ch, vch))
	 {
	    multi_hit (ch, vch, TYPE_UNDEFINED);
	    if (vch == NULL || vch->position <= POS_STUNNED)
	       continue;
	    multi_hit (ch, vch, TYPE_UNDEFINED);
	    if (vch == NULL || vch->position <= POS_STUNNED)
	       continue;
	    multi_hit (ch, vch, TYPE_UNDEFINED);
	 }
      }

   }
   return;
}

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

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

   if (IS_CLASS (ch, CLASS_MONK) && ch->monkab[BODY] < 5)
   {
      send_to_char
	 ("You need to obtain level 5 body to use Sacred Invisibility.\n\r",
	  ch);
      return;
   }

   if (IS_SET (ch->act, PLR_WIZINVIS))
   {
      REMOVE_BIT (ch->act, PLR_WIZINVIS);
      send_to_char ("You appear from a shroud of light.\n\r", ch);
      act ("$n appears from a shroud of light.", ch, NULL, NULL, TO_ROOM);
   }
   else
   {
      send_to_char ("You shield yourself in a shroud of light.\n\r", ch);
      act ("$n is shielded in a shroud of light.", ch, NULL, NULL, TO_ROOM);
      SET_BIT (ch->act, PLR_WIZINVIS);
      ch->move -= 500;
   }
   return;
}
void do_monkpowers (CHAR_DATA * ch, char *argument)
{

   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_MONK))
   {
      do_rand_typo (ch);
      return;
   }

   stc ("#g<:============================================================================:>#n\n\r", ch);
   cent_to_char ("#w-[ Monk Powers ]-#n", ch);
   stc ("#g<:============================================================================:>#n\n\r", ch);
   stc ("#g  Monk Awareness: #n\n\r", ch);
   if (ch->monkab[AWARE] < 1)
      stc ("#w         None\n\r", ch);
   if (ch->monkab[AWARE] >= 1)
      stc ("#w         Nightsight\n\r", ch);
   if (ch->monkab[AWARE] >= 2)
      stc ("#w         Shadowsight\n\r", ch);
   if (ch->monkab[AWARE] >= 3)
      stc ("#w         Truesight\n\r", ch);
   if (ch->monkab[AWARE] >= 4)
      stc ("#w         Scry\n\r", ch);
   if (ch->monkab[AWARE] >= 5)
      stc ("#w         Shield\n\r", ch);
   stc ("#g  Monk Body: #n\n\r", ch);
   if (ch->monkab[BODY] < 1)
      stc ("#w         None\n\r", ch);
   if (ch->monkab[BODY] >= 1)
      stc ("#w         Adamantium\n\r", ch);
   if (ch->monkab[BODY] >= 2)
      stc ("#w         Body of Stone (Auto)\n\r", ch);
   if (ch->monkab[BODY] >= 3)
      stc ("#w         Spiritpower\n\r", ch);
   if (ch->monkab[BODY] >= 4)
      stc ("#w         The Glow (Auto)\n\r", ch);
   if (ch->monkab[BODY] >= 5)
      stc ("#w         Sacredinvis\n\r", ch);
   stc ("#g  Monk Spirit: #n\n\r", ch);
   if (ch->monkab[SPIRIT] < 1)
      stc ("#w         None\n\r", ch);
   if (ch->monkab[SPIRIT] >= 1)
      stc ("#w         Blinding\n\r", ch);
   if (ch->monkab[SPIRIT] >= 2)
      stc ("#w         Natural Harmony (Auto)\n\r", ch);
   if (ch->monkab[SPIRIT] >= 3)
      stc ("#w         Healingtouch\n\r", ch);
   if (ch->monkab[SPIRIT] >= 4)
      stc ("#w         Deathtouch Celestial\n\r", ch);
   stc ("#g  Other:\n\r", ch);
   stc ("#w         Chi, Chistorm, Monkcreate, Fightstyle\n\r", ch);
   stc ("#g<:============================================================================:>#n\n\r", ch);
   return;
}

void do_monastry (CHAR_DATA * ch, char *argument)
{
   char buf[MAX_STRING_LENGTH];
   char arg[MAX_INPUT_LENGTH];
   CHAR_DATA *gch;
   char clan[MSL];
   one_argument (argument, arg);

   if (IS_NPC (ch))
      return;
   if (!IS_CLASS (ch, CLASS_MONK))
   {
      do_rand_typo (ch);
      return;
   }


   sprintf (buf, "The Monk Monastry:\n\r");
   send_to_char (buf, ch);
   send_to_char
      ("[      Name      ] [  Monastry   ][ Hits   % ] [ Mana   % ] [ Move   % ] [   Exp    ]\n\r",
       ch);
   for (gch = char_list; gch != NULL; gch = gch->next)
   {
      if (IS_NPC (gch))
	 continue;
      if (!IS_CLASS (gch, CLASS_MONK))
	 continue;
      if (IS_IMMORTAL (gch) && !can_see (ch, gch))
         continue;
      if (gch->clannum > 0)
         sprintf(clan, "%s", nclans_table[gch->clannum].name);
      else
         sprintf(clan, "None");
      sprintf (buf,
               "[%-16s] [%-13s] [%-7d%3d] [%-7d%3d] [%-7d%3d] [%10lli]\n\r",
	       capitalize (gch->name),clan,
	       gch->hit, (gch->hit * 100 / gch->max_hit),
	       gch->mana, (gch->mana * 100 / gch->max_mana),
	       gch->move, (gch->move * 100 / gch->max_move), gch->exp);

      send_to_char (buf, ch);
   }
   return;
}
void do_monkeq (CHAR_DATA * ch, char *argument)
{
   OBJ_INDEX_DATA *pObjIndex;
   OBJ_DATA *obj;
   char arg[MAX_INPUT_LENGTH];
   int vnum = 0;

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

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

   if (arg[0] == '\0')
   {
      stc ("What piece of monk eq do you wish to create?\n\r", ch);
      stc ("   a ring, collar, plate, leggings, boots, sleeves, helmet, cloak, visor, gloves, bracer\n\r", ch);
      return;
   }


   if (!str_cmp (arg, "ring"))
      vnum = 28000;
   else if (!str_cmp (arg, "collar"))
      vnum = 28001;
   else if (!str_cmp (arg, "plate"))
      vnum = 28002;
   else if (!str_cmp (arg, "leggings"))
      vnum = 28003;
   else if (!str_cmp (arg, "boots"))
      vnum = 28004;
   else if (!str_cmp (arg, "sleeves"))
      vnum = 28005;
   else if (!str_cmp (arg, "helmet"))
      vnum = 28006;
   else if (!str_cmp (arg, "cloak"))
      vnum = 28007;
   else if (!str_cmp (arg, "visor"))
      vnum = 28008;
   else if (!str_cmp (arg, "gloves"))
      vnum = 28009;
   else if (!str_cmp (arg, "bracer"))
      vnum = 28010;
   else
   {
      stc ("What piece of monk eq do you wish to create?\n\r", ch);
      stc ("   a ring, collar, plate, leggings, boots, sleeves, helmet, cloak, visor, gloves, bracer\n\r", ch);
      return;
   }
   if (ch->practice < 60)
   {
      send_to_char ("It costs 60 primal to create a piece of monk armor\n\r",
		    ch);
      return;
   }

   if (vnum == 0 || (pObjIndex = get_obj_index (vnum)) == NULL)
   {
      send_to_char ("Missing object, please inform Macademus.\n\r", ch);
      return;
   }
   ch->practice -= 60;
   obj = create_object (pObjIndex, 50);
   obj_to_char (obj, ch);
   act ("$p appears in a flash of white light.", ch, obj, NULL, TO_CHAR);
   act ("$p appears in a flash of white light.", ch, obj, NULL, TO_ROOM);
   return;
}
void do_guide (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   //   int ch_age = years_old(ch);
   char arg[MAX_INPUT_LENGTH];
   bool can_sire = FALSE;

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_MONK))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (IS_SET (ch->special, SPC_PRINCE))
      can_sire = TRUE;
   if (ch->pcdata->stats[UNI_GEN] < 3)
      can_sire = TRUE;

   if (arg[0] == '\0')
   {
      send_to_char ("Guide whom?\n\r", ch);
      return;
   }
   if (!can_sire)
   {
      stc ("You are Unable to Guide them\n\r", ch);
      return;
   }
/*
    if ( ch_age < 50 )
    {
       send_to_char("They must be 50 to become a monk!\n\r", ch);
       return;
    }
*/
   if ((victim = get_char_room (ch, arg)) == NULL)
   {
      send_to_char ("They aren't here.\n\r", ch);
      return;
   }

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

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

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

   if (victim->max_hit < 3000)
   {
      stc ("You need 3000hps before you can be classed\n\r", victim);
      stc ("They need 3000hps before they can be classed\n\r", ch);
      return;
   }
   if (IS_CLASS (victim, CLASS_MONK))
   {
      send_to_char ("They are already guided.\n\r", ch);
      return;
   }


   if (victim->level != LEVEL_AVATAR && !IS_IMMORTAL (victim))
   {
      send_to_char ("You can only guide avatars.\n\r", ch);
      return;
   }

   if (victim->class != 0)
   {
      stc ("They are already classed.\n\r", ch);
      return;
   }


   if (!IS_IMMUNE (victim, IMM_VAMPIRE))
   {
      send_to_char ("You cannot guide an unwilling person.\n\r", ch);
      return;
   }

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


   if (victim->exp < 50000)
   {
      send_to_char
	 ("They cannot afford the 50000 exp required to be guided from you.\n\r",
	  ch);
      return;
   }

   ch->exp -= 50000;
   victim->exp -= 50000;

   act ("You guide $N in the ways of god.", ch, NULL, victim, TO_CHAR);
   act ("$n guide $N in the ways of god.", ch, NULL, victim, TO_NOTVICT);
   act ("$n guide you in the way of god.", ch, NULL, victim, TO_VICT);
   send_to_char ("You are now a monk.\n\r", victim);
   free_string (victim->lord);
   victim->lord = str_dup (ch->name);
   victim->class = CLASS_MONK;
   //free_string(victim->clan);
   //    victim->clan=str_dup(ch->clan);
   victim->pcdata->stats[UNI_GEN] = ch->pcdata->stats[UNI_GEN] + 1;
   save_char_obj (ch);
   save_char_obj (victim);
   return;
}






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

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


   if (IS_SET (ch->newbits, NEW_MONKFLAME))
   {
      REMOVE_BIT (ch->newbits, NEW_MONKFLAME);
      send_to_char ("Your hands are no longer engulfed by flames.\n\r", ch);
      act ("$n's hands are no longer engulfed by flames.\n\r", ch, NULL, NULL,
	   TO_ROOM);
      return;
   }
   if (!IS_SET (ch->newbits, NEW_MONKFLAME))
   {
      SET_BIT (ch->newbits, NEW_MONKFLAME);
      send_to_char ("Your hands are engulfed by flames!\n\r", ch);
      act ("$n's hands are engulfed by flames!\n\r", ch, NULL, NULL, TO_ROOM);
      return;
   }
}

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

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

   if (ch->monkab[BODY] < 1)
   {
      send_to_char ("You have not learned this ability yet.\n\r", ch);
      return;
   }

   if (IS_SET (ch->newbits, NEW_MONKADAM))
   {
      REMOVE_BIT (ch->newbits, NEW_MONKADAM);
      send_to_char ("Your hands resume their normal toughness.\n\r", ch);
      act ("$n's hands resume their normal toughness.\n\r", ch, NULL, NULL,
	   TO_ROOM);
      return;
   }

   if (!IS_SET (ch->newbits, NEW_MONKADAM))
   {
      SET_BIT (ch->newbits, NEW_MONKADAM);
      send_to_char ("Your hands turn as hard as adamantium!\n\r", ch);
      act ("$n's hands turn as hard as adamantium!\n\r", ch, NULL, NULL,
	   TO_ROOM);
      return;
   }
}



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

   if (IS_NPC (ch))
      return;

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

   if (ch->monkab[SPIRIT] < 4)
   {
      send_to_char
	 ("You must obtain level 4 in Spirit to use Celestial Path.\n\r", ch);
      return;
   }

   if (ch->move < 250)
   {
      stc ("You do not have enough vitality to do that!\n\r", ch);
      return;
   }

   if (IS_SET (ch->flag2, AFF2_INARENA))
   {
      stc ("Not while in the arena.\n\r", ch);
      return;
   }

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


   if (arg[0] == '\0')
   {
      send_to_char ("Open a celestial path to who?\n\r", ch);
      return;
   }

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

   if (victim == ch
       || (IS_NPC (victim) && victim->level > 150)
       || (!IS_NPC (victim) && !IS_IMMUNE (victim, IMM_SUMMON))
       || victim->in_room == NULL)
   {
      stc ("You Failed\n\r", ch);
      return;
   }
   if (IS_NPC (victim) && IS_SET (victim->in_room->area->aflags, AFLAG_HQ))
   {
      stc ("You failed.\n\r", ch);
      return;
   }
   if IS_SET
      (victim->in_room->room_flags, ROOM_CCHAMBER)
   {
      stc ("You failed.\n\r", ch);
      return;
   }

   if (victim->in_room->vnum == ch->in_room->vnum)
   {
      send_to_char ("But you're already there!\n\r", ch);
      return;
   }

   char_from_room (ch);
   char_to_room (ch, victim->in_room);
   if (IS_NPC (victim))
   {
      sprintf (buf, "You concentrate and open a Celestial path to %s!\n\r",
	       victim->short_descr);
      send_to_char (buf, ch);
   }

   if (!IS_NPC (victim))
   {
      sprintf (buf, "You concentrate and open a Celestial path to %s!\n\r",
	       victim->name);
      send_to_char (buf, ch);
   }


   act ("$n appears through a Celestial portal!\n\r", ch, NULL, NULL,
	TO_ROOM);
   do_look (ch, "auto");
   ch->move = ch->move - 250;
   return;
}

void do_godsheal (CHAR_DATA * ch, char *argument)
{
   if (IS_NPC (ch))
      return;
   if (!IS_CLASS (ch, CLASS_MONK))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }


   if (IS_CLASS (ch, CLASS_MONK) && ch->pcdata->powers[PMONK] < 12)

   {
      send_to_char ("You need to obtain heal to use heal.\n\r", ch);
      return;
   }

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

   if (ch->fighting != NULL)
   {
      send_to_char ("You are surrounded in a glowing halo of energy.\n\r",
		    ch);
      act ("$n is surrounded by a glowing halo, and looks very relaxed.\n\r",
	   ch, NULL, NULL, TO_ROOM);
      ch->hit += 150;
      ch->mana -= 400;
      WAIT_STATE (ch, 12);
      return;
   }

   if (ch->fighting == NULL)
   {
      send_to_char ("You feel a mighty force lay his hands on you.\n\r", ch);
      act ("$n is surrounded by a glowing halo, and looks very relaxed.\n\r",
	   ch, NULL, NULL, TO_ROOM);
      ch->hit += 500;
      ch->mana -= 400;
      WAIT_STATE (ch, 8);
      return;
   }
}



int dambonus args ((CHAR_DATA * ch, CHAR_DATA * victim, int dam, int stance));


int find_dam (CHAR_DATA * ch, CHAR_DATA * victim, int dam, bool foot)
{
   OBJ_DATA *boots;
   int stance;

   dam += char_damroll (ch);

   if (dam == 0)
      dam = 1;

   if (!IS_AWAKE (victim))
      dam *= 2;

   if (!IS_NPC (ch) && IS_CLASS (ch, CLASS_MONK))
   {
      if (ch->chi[CURRENT] > 0 && ch->chi[CURRENT] < 3)
	 dam *= 1.2;
      if (ch->chi[CURRENT] > 2)
	 dam *= (ch->chi[CURRENT] / 2);
   }

   if (!IS_NPC (victim) && IS_CLASS (victim, CLASS_WEREWOLF))
   {
      if (IS_SET (victim->special, SPC_WOLFMAN))
	 dam *= 0.3;
      if (victim->pcdata->powers[WPOWER_BOAR] > 2)
	 dam *= 0.3;
      if (foot == TRUE)
      {
	 if ((boots = get_eq_char (ch, WEAR_FEET)) != NULL
	     && IS_SET (boots->spectype, SITEM_SILVER))
	    dam *= 2;
      }
      if (foot == FALSE)
      {
	 if ((boots = get_eq_char (ch, WEAR_HANDS)) != NULL
	     && IS_SET (boots->spectype, SITEM_SILVER))
	    dam *= 2;
      }
   }

   if (!IS_NPC (ch))
      dam = dam + (dam * ((ch->wpn[0] + 1) / 100));

   if (!IS_NPC (ch))
   {
      stance = ch->stance[0];
      if (IS_STANCE (ch, STANCE_NORMAL))
	 dam *= 1.25;
      else
	 dam = dambonus (ch, victim, dam, stance);
   }

/*   if (dam > 1400)
      dam = number_range (1340, 1420);*/

   if (dam <= 0)
      dam = 2;

   return dam;

}

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

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

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

   if (ch->monkab[SPIRIT] < 4)
   {
      stc ("You need to obtain level 4 spirit to use Death touch.\n\r", ch);
      return;
   }

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

   if (is_safe (ch, victim))
      return;

   if (victim == ch)
   {
      stc ("That doesn't seem like a good idea.\n\r", ch);
      return;
   }

   if (IS_SET (victim->monkstuff, MONK_DEATH))
   {
      send_to_char ("You no longer feel the death touch on you.\n\r", victim);
      REMOVE_BIT (victim->monkstuff, MONK_DEATH);
      WAIT_STATE (ch, 12);
      return;
   }

   WAIT_STATE (ch, 12);
   act ("You place your hands on $N's head and channel negative energy into $m.", ch, NULL, victim, TO_CHAR);
   act ("$n places $s hands on your head, and you scream in utter pain.", ch,
	NULL, victim, TO_VICT);
   act ("$n places $s hands on $N's head and $N screams in pain.", ch, NULL,
	victim, TO_ROOM);
   SET_BIT (victim->monkstuff, MONK_DEATH);
   return;
}

/* Replaced with a Renew Type Power - TIj
void do_healingtouch( CHAR_DATA *ch, char *argument )
{
    CHAR_DATA *victim;
    char arg[MAX_INPUT_LENGTH];

    argument = one_argument( argument, arg );

    if (IS_NPC(ch)) return;

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

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

    if ( ch->monkab[SPIRIT] < 3 )
    {
	stc("You need to obtain level 3 spirit to use Healing touch.\n\r",ch);
	return;
    }

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

    WAIT_STATE(ch, 12);
    if ( victim == ch )
    {
	stc("You focus your energy, and magical sparks leap out of your body.\n\r",ch);
	act("$n concentrates, and magical sparks leap out of $s body.",ch,NULL,NULL,TO_ROOM);
	SET_BIT(ch->monkstuff, MONK_HEAL);
        return;
    }

    act("You place your hands on $N's head and focus your energy on $M.",ch,NULL,victim,TO_CHAR);
    act("$n places $s hands on your head and you feel warmer.",ch,NULL,victim,TO_VICT);
    act("$n places $s hands on $N's head and concentrates.",ch,NULL,victim,TO_ROOM);
    SET_BIT(victim->monkstuff, MONK_HEAL);
    return;

}
*/
void do_healingtouch (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   char arg[MAX_INPUT_LENGTH];
   char buf[MAX_STRING_LENGTH];
   int sn, check, oldcheck;

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

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

   if (ch->monkab[SPIRIT] < 3)
   {
      send_to_char
	 ("You need to obtain level 3 spirit to use Healing touch.\n\r", ch);
      return;
   }
   if (ch->fight_timer > 0)
   {
      stc ("Not until your fight timer has cleared.\n\r", ch);
      return;
   }
   if (ch->pcdata->obeah > 0)
   {
      if (ch->pcdata->obeah > 1)
	 sprintf (buf,
		  "You cannot call upon your healing powers for another %d seconds.\n\r",
		  ch->pcdata->obeah);
      else
	 sprintf (buf,
		  "You cannot call upon your healing powers for another 1 second.\n\r");
      send_to_char (buf, ch);
      return;
   }

   if (arg[0] == '\0')
   {
      send_to_char ("Who do you want to heal with the Hand of God?\n\r", ch);
      return;
   }

   if ((victim = get_char_room (ch, arg)) == NULL)
   {
      send_to_char ("They are not here.\n\r", ch);
      return;
   }
   if (victim->position == POS_FIGHTING)
   {
      stc ("They have too much negative energy surrounding them for your healing touch to work!\n\r", ch);
      return;
   }
   if (victim->fight_timer > 0)
   {
      stc ("Sorry you cant use that on a player that has a fight timer!\n\r",
	   ch);
      return;
   }
   if (ch->mana < 300)
   {
      send_to_char ("You don't have enough energy to use heal.\n\r", ch);
      return;
   }


   if ((victim->loc_hp[0] + victim->loc_hp[1] + victim->loc_hp[2] +
	victim->loc_hp[3] + victim->loc_hp[4] + victim->loc_hp[5] +
	victim->loc_hp[6]) == 0 && victim->hit == victim->max_hit)
   {
      send_to_char ("They don't require any healing.\n\r", ch);
      return;
   }
   act ("You place your hands on $N's head and focus your energy on $M.", ch,
	NULL, victim, TO_CHAR);
   act ("$n places $s hands on your head and you feel warmer.", ch, NULL,
	victim, TO_VICT);
   act ("$n places $s hands on $N's head and concentrates.", ch, NULL, victim,
	TO_ROOM);
   ch->pcdata->obeah = 60;

   if ((check = victim->loc_hp[6]) > 0)
   {
      oldcheck = 0;
      sn = skill_lookup ("clot");
      while (oldcheck != (check = victim->loc_hp[6]))
      {
	 oldcheck = check;
	 (*skill_table[sn].spell_fun) (sn, ch->level, ch, victim);
      }
   }
   if ((check =
	(victim->loc_hp[0] + victim->loc_hp[1] + victim->loc_hp[2] +
	 victim->loc_hp[3] + victim->loc_hp[4] + victim->loc_hp[5])) > 0)
   {
      oldcheck = 0;
      while (oldcheck !=
	     (check =
	      victim->loc_hp[0] + victim->loc_hp[1] + victim->loc_hp[2] +
	      victim->loc_hp[3] + victim->loc_hp[4] + victim->loc_hp[5]))
      {
	 oldcheck = check;
	 reg_mend (victim);
      }
   }
   if (victim->hit < victim->max_hit)
   {
      victim->hit = victim->max_hit;
      victim->move = victim->max_move;
      send_to_char ("You have been completely healed!\n\r", victim);
      act ("$n's wounds have been completely healed!", victim, NULL, NULL,
	   TO_ROOM);
      update_pos (victim);
   }
   return;
}



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

   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_MONK) || ch->monkab[BODY] < 3)
   {
      stc ("Huh?\n\r", ch);
      return;
   }

   if (IS_SET (ch->newbits, NEW_POWER))
   {
      stc ("Your spiritual power fades.\n\r", ch);
      REMOVE_BIT (ch->newbits, NEW_POWER);
      return;
   }

   if (ch->move < 100)
   {
      stc ("You are too exhausted.\n\r", ch);
      return;
   }

   SET_BIT (ch->newbits, NEW_POWER);
   ch->move -= 25;
   stc ("Your body pulses with spiritual energy.\n\r", ch);
   return;

   return;

}

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

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

   if (ch->chi[CURRENT] < 1)
   {
      stc ("You are already totally relaxed.\n\r", ch);
      return;
   }

   if (ch->position == POS_FIGHTING)
   {
      stc ("You cannot relax your ch'i while fighting!\n\r", ch);
      return;
   }

   if (ch->beast_timer > 0)
   { 
      char buf[MSL];
      sprintf(buf,"You must wait another %d ticks before you can relax again.\n\r",ch->beast_timer);
      stc(buf,ch);
      return;
   }

   ch->chi[CURRENT]--;
   ch->beast_timer = 20;
   WAIT_STATE (ch, 12);
   stc ("You breathe deeply and relax your focus.\n\r", ch);
   act ("$n looks more relaxed.", ch, NULL, NULL, TO_ROOM);
   return;
}

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

   if (IS_NPC (ch))
      return;

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

   if (ch->fighting == NULL)
   {
      stc ("You must be fighting to focus your ch'i.\n\r", ch);
      return;
   }

   if (ch->chi[CURRENT] >= ch->chi[MAXIMUM])
   {
      if (ch->chi[MAXIMUM] == 0)
	 stc ("You have not gained any control of your ch'i.\n\r", ch);
      else
      {
	 sprintf (buf, "You cannot focus your ch'i past a level of %d.",
		  ch->chi[MAXIMUM]);
	 stc (buf, ch);
      }
      return;
   }

   if (ch->move < 500 + ((ch->chi[CURRENT] + 1) * 20))
   {
      stc ("You are too exhausted.\n\r", ch);
      return;
   }

   if (ch->chi[CURRENT] == 0)
   {
      stc ("Your body flickers with energy.\n\r", ch);
      act ("$n's body flickers with energy.", ch, NULL, NULL, TO_ROOM);
   }
   if (ch->chi[CURRENT] == 1)
   {
      stc ("Your body pulses with energy.\n\r", ch);
      act ("$n's body pulses with energy.", ch, NULL, NULL, TO_ROOM);
   }
   if (ch->chi[CURRENT] == 2)
   {
      stc ("Your body glows with blue energy.\n\r", ch);
      act ("$n's body glows with blue energy.", ch, NULL, NULL, TO_ROOM);
   }
   if (ch->chi[CURRENT] == 3)
   {
      stc ("Your body glows bright red.\n\r", ch);
      act ("$n's body glows bright red.", ch, NULL, NULL, TO_ROOM);
   }
   if (ch->chi[CURRENT] == 4)
   {
      stc ("Your body flashes with power.\n\r", ch);
      act ("$n's body flashes with power.", ch, NULL, NULL, TO_ROOM);
   }
   if (ch->chi[CURRENT] == 5)
   {
      stc ("Your body emits sparks of energy as you fully focus your ch'i.\n\r", ch);
      act ("$n's body emits sparks of energy.", ch, NULL, NULL, TO_ROOM);
   }

   WAIT_STATE (ch, 12);

   if (ch->chi[CURRENT] < ch->chi[MAXIMUM])
      ch->chi[CURRENT]++;

   ch->move -= ((ch->chi[CURRENT] * 20));
   return;

}

void do_shinkick (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   bool foot = TRUE;
   int dam;

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

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

   dam = find_dam (ch, victim, dam, foot);

   if (ch->monkcrap == 0)
   {
      stc ("Your aura glows light blue for a moment.\n\r", ch);
      act ("$n's aura glows a light blue for a moment.", ch, NULL, victim,
	   TO_VICT);
      SET_BIT (ch->monkcrap, COMB_SHIN);
   }
   else if (ch->monkcrap > 0)
   {
      stc ("Your aura fades away.\n\r", ch);
      act ("$n's aura fades away.", ch, NULL, victim, TO_VICT);
      ch->monkcrap = 0;
   }

   act ("You deliver a powerful blow to $N's shin.", ch, NULL, victim,
	TO_CHAR);
   act ("$n delivers a powerful blow to your shin.", ch, NULL, victim,
	TO_VICT);
   act ("$n delivers a powerful blow to $N's shin.", ch, NULL, victim,
	TO_NOTVICT);
   damage (ch, victim, dam, gsn_shinkick);
   if (number_range (1, (7 - ch->chi[CURRENT])) == 1)
      victim->position = POS_STUNNED;
   return;
}

void do_palmstrike (CHAR_DATA * ch, char *argument)
{
   char arg[MAX_INPUT_LENGTH];
   CHAR_DATA *victim;
   int dam;
   bool foot = FALSE;

   one_argument (argument, arg);

   if (IS_NPC (ch))
      return;
   if (!IS_CLASS (ch, CLASS_MONK))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if ((victim = get_char_room (ch, arg)) == NULL)
   {
      send_to_char ("You aren't fighting anyone.\n\r", ch);
      return;
   }

   if (ch == victim)
   {
      send_to_char ("You cannot palm strike yourself!\n\r", ch);
      return;
   }

   if (is_safe (ch, victim))
      return;

   if (IS_AFFECTED (ch, AFF_STEELSHIELD))
   {
      send_to_char ("You cannot attack while in a steelshield.\r\n", ch);
      return;
   }
   if (IS_AFFECTED (victim, AFF_STEELSHIELD))
   {
      send_to_char ("You cannot someone in a steelshield.\r\n", ch);
      return;
   }

   if (victim->position == POS_FIGHTING)
   {
      send_to_char ("You can only palm strike someone who is standing.\n\r",
		    ch);
      return;
   }

   act ("You slam your palm into $N's chest.", ch, NULL, victim, TO_CHAR);
   act ("$n slams $s palm into your chest.", ch, NULL, victim, TO_VICT);
   act ("$n slams $s palm into $N's chest.", ch, NULL, victim, TO_NOTVICT);
   WAIT_STATE (ch, 25);
   dam = number_range (5, 50);

   find_dam (ch, victim, dam, foot);
   dam /= 2;

   damage (ch, victim, dam, gsn_palmstrike);
   if (victim == NULL || victim->position == POS_DEAD || dam < 1)
      return;
   if (victim->position == POS_FIGHTING)
      stop_fighting (victim, TRUE);
   act ("You fall to the ground stunned!", victim, NULL, NULL, TO_CHAR);
   act ("$n falls to the ground stunned!", victim, NULL, NULL, TO_ROOM);
   victim->position = POS_STUNNED;
   return;
}

void do_knee (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   bool foot = TRUE;
   int dam;

   if (!IS_FS (ch, TECH_KNEE))
   {
      stc ("You haven't learned that technique.\n\r", ch);
      return;
   }

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

   WAIT_STATE (ch, 11);
   dam = number_range (1, 6);

   dam = find_dam (ch, victim, dam, foot);

   if ((IS_SET (ch->monkcrap, COMB_SHIN) || IS_SET (ch->monkcrap, COMB_REV1)) && !IS_SET (ch->monkcrap, COMB_KNEE))
   {
      stc ("Your aura glows dark blue.\n\r", ch);
      act ("$n's aura glows dark blue.", ch, NULL, victim, TO_VICT);
      SET_BIT (ch->monkcrap, COMB_KNEE);
   }
   else if (ch->monkcrap > 0)
   {
      stc ("Your aura slowly fades away.\n\r", ch);
      act ("$n's aura slowly fades away.\n\r", ch, NULL, victim, TO_VICT);
      ch->monkcrap = 0;
   }

   act ("You leap up and slam your knee into $N's chin.", ch, NULL, victim,
	TO_CHAR);
   act ("$n leaps up and slams $s knee into your chin.", ch, NULL, victim,
	TO_VICT);
   act ("$n leaps up and slams $s knee into $N's chin.", ch, NULL, victim,
	TO_NOTVICT);
   damage (ch, victim, dam, gsn_knee);
   return;
}

void do_reverse (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   bool foot = TRUE;
   int dam;
   int move = 0;

   if (!IS_FS (ch, TECH_SWEEP))
   {
      stc ("You haven't learned that technique.\n\r", ch);
      return;
   }

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

   WAIT_STATE (ch, 11);

   if (ch->monkcrap == 0)
   {
      stc ("Your aura glows a light blue for a moment.\n\r", ch);
      SET_BIT (ch->monkcrap, COMB_REV1);
   }

   else if (IS_SET (ch->monkcrap, COMB_REV1)
	    && IS_SET (ch->monkcrap, COMB_SWEEP))
   {
      act ("You spin around and kick $N viciously in the head.", ch, NULL,
	   victim, TO_CHAR);
      act ("You place your hands on $N's head.", ch, NULL, victim, TO_CHAR);
      act ("You feel revitalized.", ch, NULL, victim, TO_CHAR);
      act ("$n's choyoken **- PULVERISES -** you!", ch, NULL, victim,
	   TO_VICT);
      act ("$n's choyoken **- PULVERISES -** $N!", ch, NULL, victim,
	   TO_NOTVICT);
      move = (victim->move / 4);
      victim->move -= move;
      ch->move += UMIN (10000, move);
      ch->hit += UMIN (10000, move);
      ch->mana += UMIN (10000, move);
      ch->monkcrap = 0;
      return;
   }

   dam = number_range (1, 4);

   dam = find_dam (ch, victim, dam, foot);
   act ("You crouch down and sweep $N's legs out from under $M.", ch, NULL,
	victim, TO_CHAR);
   act ("$n crouches down and sweeps your legs out from under you", ch, NULL,
	victim, TO_VICT);
   act ("$n crouches down and sweeps $N's legs out from under $M", ch, NULL,
	victim, TO_NOTVICT);
   damage (ch, victim, dam, gsn_monksweep);
   return;
}
void do_sweep (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   bool foot = TRUE;
   int dam, mana;

   if (!IS_CLASS (ch, CLASS_MONK))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (!IS_FS (ch, TECH_SWEEP))
   {
      stc ("You haven't learned that technique.\n\r", ch);
      return;
   }
   if ((victim = ch->fighting) == NULL)
   {
      send_to_char ("You aren't fighting anyone.\n\r", ch);
      return;
   }

   WAIT_STATE (ch, 11);
   dam = number_range (1, 4);
   dam = find_dam (ch, victim, dam, foot);

   if (IS_SET (ch->monkcrap, COMB_REV1))
   {
      stc ("Your aura glows a light blue for a moment.\n\r", ch);
      SET_BIT (ch->monkcrap, COMB_SWEEP);
   }
   if (IS_COMB (ch, COMB_THRUST1) && IS_COMB (ch, COMB_THRUST2))
   {
      act ("You sweep around and kick $N viciously in the stomach.", ch, NULL,
	   victim, TO_CHAR);
      act ("You place your hands on $N's head.", ch, NULL, victim, TO_CHAR);
      act ("You feel revitalized.", ch, NULL, victim, TO_CHAR);
      act ("$n's raptor strike #R**- SIPHONS -**#n you!", ch, NULL, victim,
	   TO_VICT);
      act ("$n's raptor strike #R**- SIPHONS -**#n $N!", ch, NULL, victim,
	   TO_NOTVICT);
      if (victim->mana > 100000)
          mana = (victim->mana / 4);
      else
          mana = (victim->mana / 2);
      victim->mana -= mana;
      ch->move += UMIN (10000, mana);
      ch->hit += UMIN (10000, mana);
      ch->mana += UMIN (10000, mana);
      ch->monkcrap = 0;
      return;
   }
   if (IS_COMB (ch, COMB_REV1) && IS_COMB (ch, COMB_KNEE))
   {
      act ("You crouch down and sweep $N's legs out from under $M.", ch, NULL,
	   victim, TO_CHAR);
      act ("$n crouches down and sweeps your legs out from under you", ch,
	   NULL, victim, TO_VICT);
      act ("$n crouches down and sweeps $N's legs out from under $M", ch,
	   NULL, victim, TO_NOTVICT);
      act ("You place strike $N on the neck with two fingers #G**PARALYSING**#n $M.", ch, NULL, victim, TO_CHAR);
      act ("$n's neck pinch #G**- PARALYSES -**#n you!", ch, NULL, victim,
	   TO_VICT);
      act ("$n's neck pinch #G**- PARALYSES -**#n $N!", ch, NULL, victim,
	   TO_NOTVICT);
      WAIT_STATE (victim, 24);
      ch->monkcrap = 0;
      return;
   }
   act ("You crouch down and sweep $N's legs out from under $M.", ch, NULL,
	victim, TO_CHAR);
   act ("$n crouches down and sweeps your legs out from under you", ch, NULL,
	victim, TO_VICT);
   act ("$n crouches down and sweeps $N's legs out from under $M", ch, NULL,
	victim, TO_NOTVICT);
   damage (ch, victim, dam, gsn_monksweep);
   return;
}

void do_elbow (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   bool foot = FALSE;
   int dam;

   if (!IS_FS (ch, TECH_ELBOW))
   {
      stc ("You haven't learned that technique.\n\r", ch);
      return;
   }

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

   WAIT_STATE (ch, 11);
   dam = number_range (1, 6);

   dam = find_dam (ch, victim, dam, foot);

   act ("You ram your elbow into $N's face.", ch, NULL, victim, TO_CHAR);
   act ("$n rams $s elbow into your face.", ch, NULL, victim, TO_VICT);
   act ("$n rams $s elbow into $N's face.", ch, NULL, victim, TO_NOTVICT);
   damage (ch, victim, dam, gsn_elbow);
   return;
}


void do_thrustkick (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   bool foot = TRUE;
   int dam;

   if (!IS_FS (ch, TECH_THRUST))
   {
      stc ("You haven't learned that technique.\n\r", ch);
      return;
   }

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

   WAIT_STATE (ch, 11);
   dam = number_range (1, 5);

   dam = find_dam (ch, victim, dam, foot);

   if (ch->monkcrap == 0 && !IS_SET (ch->monkcrap, COMB_THRUST1))
   {
      stc ("Your aura glows dark blue for a moment.\n\r", ch);
      act ("$n's aura glows dark blue for a moment.", ch, NULL, victim,
	   TO_VICT);
      act ("$n's aura glows dark blue for a moment.", ch, NULL, victim,
	   TO_NOTVICT);
      SET_BIT (ch->monkcrap, COMB_THRUST1);
   }
   else if (IS_SET (ch->monkcrap, COMB_THRUST1)
	    && !IS_SET (ch->monkcrap, COMB_THRUST2))
   {
      stc ("Your aura flashes bright blue.\n\r", ch);
      act ("$n's aura flashes bright blue.", ch, NULL, victim, TO_VICT);
      act ("$n's aura flashes bright blue.", ch, NULL, victim, TO_NOTVICT);
      SET_BIT (ch->monkcrap, COMB_THRUST2);
   }
   else if (ch->monkcrap != 0)
   {
      stc ("Your aura fades.\n\r", ch);
      act ("$n's aura fades.", ch, NULL, victim, TO_VICT);
      act ("$n's aura fades.", ch, NULL, victim, TO_NOTVICT);
      ch->monkcrap = 0;
   }

   act ("You deliver a thrust kick to $N's chest.", ch, NULL, victim,
	TO_CHAR);
   act ("$n delivers a powerful thrust kick to your chest.", ch, NULL, victim,
	TO_VICT);
   act ("$n delivers a powerful thrust kick to $N's chest.", ch, NULL, victim,
	TO_NOTVICT);
   damage (ch, victim, dam, gsn_thrustkick);
   return;
}

void do_spinkick (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   bool foot = TRUE;
   int dam;

   if (!IS_FS (ch, TECH_SPIN))
   {
      stc ("You haven't learned that technique.\n\r", ch);
      return;
   }

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

   WAIT_STATE (ch, 11);
   dam = number_range (1, 4);

   dam = find_dam (ch, victim, dam, foot);

   if (IS_COMB (ch, COMB_THRUST1) && IS_COMB (ch, COMB_THRUST2))
   {
      act ("Your aura pulsates and channels energy into your attack.", ch,
	   NULL, NULL, TO_CHAR);
      act ("$n's aura pulsates and channels energy into $s attack.", ch, NULL,
	   victim, TO_VICT);
      act ("$n's aura pulsates and channels energy into $s attack.", ch, NULL,
	   victim, TO_NOTVICT);
      ch->monkcrap = 0;
      dam /= 1.2;
      damage (ch, victim, dam, gsn_lightningkick);
      if (ch->chi[CURRENT] > 1)
      {
	 dam /= 1.2;
	 damage (ch, victim, dam, gsn_lightningkick);
      }
      if (ch->chi[CURRENT] > 2)
      {
	 dam /= 1.2;
	 damage (ch, victim, dam, gsn_lightningkick);
      }
      if (ch->chi[CURRENT] > 3)
      {
	 dam /= 1.2;
	 damage (ch, victim, dam, gsn_lightningkick);
      }
      if (ch->chi[CURRENT] > 4)
      {
	 dam /= 1.2;
	 damage (ch, victim, dam, gsn_lightningkick);
      }
      if (ch->chi[CURRENT] > 5)
      {
	 dam /= 1.2;
	 damage (ch, victim, dam, gsn_lightningkick);
      }
      return;
   }
   else if (IS_SET (ch->monkcrap, COMB_SHIN)
	    && IS_SET (ch->monkcrap, COMB_KNEE))
   {
      CHAR_DATA *vch;
      CHAR_DATA *vch_next;
      CHAR_DATA *mount;
      int number_hit = 0;

      ch->monkcrap = 0;
      stc ("You spin around and around, going berserk.\n\r", ch);
      act ("$n body speeds up, and $e spins around rapidly.", ch, NULL,
	   victim, TO_ROOM);
      for (vch = char_list; vch != NULL; vch = vch_next)
      {
	 vch_next = vch->next;
	 if (number_hit > (ch->chi[CURRENT] + 1))
	    continue;
	 if (vch->in_room == NULL)
	    continue;
	 if (!IS_NPC (vch) && vch->pcdata->chobj != NULL)
	    continue;
	 if (ch == vch)
	    continue;
	 if (vch->in_room == ch->in_room)
	 {
	    if ((mount = ch->mount) != NULL)
	    {
	       if (mount == vch)
		  continue;
	    }
	    if (can_see (ch, vch))
	    {
	       one_hit (ch, vch, gsn_tornadokick, 0);
	       one_hit (ch, vch, gsn_tornadokick, 0);
	       number_hit++;
	    }
	 }
      }
      return;
   }

   act ("You spin around and deliver a blow to $N's head.", ch, NULL, victim,
	TO_CHAR);
   act ("$n spins around and delivers a blow to your head.", ch, NULL, victim,
	TO_VICT);
   act ("$n spins around and delivers a devastating blow to $N's head.", ch,
	NULL, victim, TO_NOTVICT);
   damage (ch, victim, dam, gsn_spinkick);
   return;
}

void do_backfist (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   bool foot = FALSE;
   int dam;

   if (!IS_FS (ch, TECH_BACK))
   {
      stc ("You haven't learned that technique.\n\r", ch);
      return;
   }

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

   WAIT_STATE (ch, 11);
   dam = number_range (1, 5);

   dam = find_dam (ch, victim, dam, foot);

   act ("You spin around and slam $N's jaw with your fist.", ch, NULL, victim,
	TO_CHAR);
   act ("$n spins around and slams you in the jaw with $s fist.", ch, NULL,
	victim, TO_VICT);
   act ("$n spins around and slams $N in the jaw with $s fist.", ch, NULL,
	victim, TO_NOTVICT);
   damage (ch, victim, dam, gsn_backfist);
   return;
}


void do_learn (CHAR_DATA * ch, char *argument)
{
   char arg[MAX_INPUT_LENGTH];
   char arg1[MAX_INPUT_LENGTH];
   char buf[MAX_STRING_LENGTH];
   char lin[MAX_STRING_LENGTH];
   int inpart = 0;
   int cost = 50000;

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

   if (IS_NPC (ch))
      return;

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


   sprintf (lin,
	    "===============================================================================\n\r");

   if (arg[0] == '\0')
   {
      stc (" Syntax: Learn <fight|techniques|abilities|chi> <power|chi>\n\r",
	   ch);
      stc ("================================| Fight Styles |==============================\n\r", ch);
      sprintf (buf,
	       "       Trip     [%s] Kick      [%s] Bash     [%s] Elbow    [%s] Knee     [%s]   \n\r",
	       IS_FS (ch, FS_TRIP) ? "*" : " ", IS_FS (ch,
						       FS_KICK) ? "*" : " ",
	       IS_FS (ch, FS_BASH) ? "*" : " ", IS_FS (ch,
						       FS_ELBOW) ? "*" : " ",
	       IS_FS (ch, FS_KNEE) ? "*" : " ");
      stc (buf, ch);
      sprintf (buf,
	       "       Disarm   [%s] Bite      [%s] Dirt     [%s] Grapple  [%s] Punch    [%s]   \n\r",
	       IS_FS (ch, FS_DISARM) ? "*" : " ", IS_FS (ch,
							 FS_BITE) ? "*" : " ",
	       IS_FS (ch, FS_DIRT) ? "*" : " ", IS_FS (ch,
						       FS_GRAPPLE) ? "*" :
	       " ", IS_FS (ch, FS_PUNCH) ? "*" : " ");
      stc (buf, ch);
      sprintf (buf,
	       "       Rip      [%s] Stamp     [%s] Backfist [%s] Jumpkick [%s] Spinkick [%s]   \n\r",
	       IS_FS (ch, FS_RIP) ? "*" : " ", IS_FS (ch,
						      FS_STAMP) ? "*" : " ",
	       IS_FS (ch, FS_BACKFIST) ? "*" : " ", IS_FS (ch,
							   FS_JUMPKICK) ? "*"
	       : " ", IS_FS (ch, FS_SPINKICK) ? "*" : " ");
      stc (buf, ch);
      sprintf (buf,
	       "       Sweep    [%s] Charge    [%s] Hurl     [%s] Gouge    [%s] Headbutt [%s]   \n\r",
	       IS_FS (ch, FS_SWEEP) ? "*" : " ", IS_FS (ch,
							FS_CHARGE) ? "*" :
	       " ", IS_FS (ch, FS_HURL) ? "*" : " ", IS_FS (ch,
							    FS_GOUGE) ? "*" :
	       " ", IS_FS (ch, FS_HEADBUTT) ? "*" : " ");
      stc (buf, ch);
      stc ("===============================================================================\n\r", ch);
      stc ("                                   Techniques                                  \n\r", ch);
      stc (lin, ch);
      sprintf (buf,
	       "    Thrust Kick [%s]   Spin Kick   [%s]   Backfist    [%s]   Palm Strike [%s]   \n\r",
	       IS_FS (ch, TECH_THRUST) ? "*" : " ", IS_FS (ch,
							   TECH_SPIN) ? "*" :
	       " ", IS_FS (ch, TECH_BACK) ? "*" : " ", IS_FS (ch,
							      TECH_PALM) ? "*"
	       : " ");
      stc (buf, ch);
      sprintf (buf,
	       "    Elbow       [%s]   Sweep       [%s]   Shin Kick   [%s]   Knee        [%s]   \n\r",
	       IS_FS (ch, TECH_ELBOW) ? "*" : " ", IS_FS (ch,
							  TECH_SWEEP) ? "*" :
	       " ", IS_FS (ch, TECH_SHIN) ? "*" : " ", IS_FS (ch,
							      TECH_KNEE) ? "*"
	       : " ");
      stc (buf, ch);
      stc (lin, ch);
      stc ("                                   Abilities                                   \n\r", ch);
      stc (lin, ch);
      sprintf (buf,
	       "                 Awareness [%s%s%s%s%s]             Body      [%s%s%s%s%s]\n\r",
	       ch->monkab[AWARE] > 0 ? "*" : " ",
	       ch->monkab[AWARE] > 1 ? "*" : " ",
	       ch->monkab[AWARE] > 2 ? "*" : " ",
	       ch->monkab[AWARE] > 3 ? "*" : " ",
	       ch->monkab[AWARE] > 4 ? "*" : " ",
	       ch->monkab[BODY] > 0 ? "*" : " ",
	       ch->monkab[BODY] > 1 ? "*" : " ",
	       ch->monkab[BODY] > 2 ? "*" : " ",
	       ch->monkab[BODY] > 3 ? "*" : " ",
	       ch->monkab[BODY] > 4 ? "*" : " ");
      stc (buf, ch);
      sprintf (buf,
	       "		  Combat   [%s%s%s%s]              Spirit    [%s%s%s%s]\n\r",
	       ch->monkab[COMBAT] > 0 ? "*" : " ",
	       ch->monkab[COMBAT] > 1 ? "*" : " ",
	       ch->monkab[COMBAT] > 2 ? "*" : " ",
	       ch->monkab[COMBAT] > 3 ? "*" : " ",
	       ch->monkab[SPIRIT] > 0 ? "*" : " ",
	       ch->monkab[SPIRIT] > 1 ? "*" : " ",
	       ch->monkab[SPIRIT] > 2 ? "*" : " ",
	       ch->monkab[SPIRIT] > 3 ? "*" : " ");
      stc (buf, ch);
      stc (lin, ch);
      stc ("                                      Chi\n\r", ch);
      stc (lin, ch);
      sprintf (buf,
	       "                 You have attained a level %d mastery of your Ch'i.\n\r",
	       ch->chi[MAXIMUM]);
      stc (buf, ch);
      if (ch->chi[CURRENT] > 0)
      {
	 sprintf (buf,
		  "                     Your ch'i is currently active at level %d\n\r",
		  ch->chi[CURRENT]);
	 stc (buf, ch);
      }
      else
	 stc (" 	 	    You are currently not focusing your ch'i\n\r", ch);
      stc (lin, ch);
      return;
   }

   if (!str_cmp (arg1, "fight"))
   {
      if (!str_cmp (arg, "trip"))
	 inpart = FS_TRIP;
      else if (!str_cmp (arg, "kick"))
	 inpart = FS_KICK;
      else if (!str_cmp (arg, "bash"))
	 inpart = FS_BASH;
      else if (!str_cmp (arg, "elbow"))
	 inpart = FS_ELBOW;
      else if (!str_cmp (arg, "knee"))
	 inpart = FS_KNEE;
      else if (!str_cmp (arg, "headbutt"))
	 inpart = FS_HEADBUTT;
      else if (!str_cmp (arg, "disarm"))
	 inpart = FS_DISARM;
      else if (!str_cmp (arg, "bite"))
	 inpart = FS_BITE;
      else if (!str_cmp (arg, "dirt"))
	 inpart = FS_DIRT;
      else if (!str_cmp (arg, "grapple"))
	 inpart = FS_GRAPPLE;
      else if (!str_cmp (arg, "punch"))
	 inpart = FS_PUNCH;
      else if (!str_cmp (arg, "gouge"))
	 inpart = FS_GOUGE;
      else if (!str_cmp (arg, "rip"))
	 inpart = FS_RIP;
      else if (!str_cmp (arg, "stamp"))
	 inpart = FS_STAMP;
      else if (!str_cmp (arg, "backfist"))
	 inpart = FS_BACKFIST;
      else if (!str_cmp (arg, "jumpkick"))
	 inpart = FS_JUMPKICK;
      else if (!str_cmp (arg, "spinkick"))
	 inpart = FS_SPINKICK;
      else if (!str_cmp (arg, "hurl"))
	 inpart = FS_HURL;
      else if (!str_cmp (arg, "sweep"))
	 inpart = FS_SWEEP;
      else if (!str_cmp (arg, "charge"))
	 inpart = FS_CHARGE;
      else
      {
	 do_learn (ch, "");
	 return;
      }
   }
   else if (!strcmp (arg1, "techniques"))
   {
      if (!str_cmp (arg, "knee"))
      {
	 inpart = TECH_KNEE;
	 cost = 200000;
      }
      else if (!str_cmp (arg, "spin"))
      {
	 inpart = TECH_SPIN;
	 cost = 200000;
      }
      else if (!str_cmp (arg, "backfist"))
      {
	 inpart = TECH_BACK;
	 cost = 200000;
      }
      else if (!str_cmp (arg, "elbow"))
      {
	 inpart = TECH_ELBOW;
	 cost = 200000;
      }
      else if (!str_cmp (arg, "palm"))
      {
	 inpart = TECH_PALM;
	 cost = 200000;
      }
      else if (!str_cmp (arg, "shin"))
      {
	 inpart = TECH_SHIN;
	 cost = 200000;
      }
      else if (!str_cmp (arg, "sweep"))
      {
	 inpart = TECH_SWEEP;
	 cost = 200000;
      }
      else if (!str_cmp (arg, "thrust"))
      {
	 inpart = TECH_THRUST;
	 cost = 200000;
      }
      else
      {
	 do_learn (ch, "");
	 return;
      }
   }
   else if (!str_cmp (arg1, "abilities"))
   {
      if (!str_cmp (arg, "body"))
      {
	 inpart = BODY;
	 cost = 500000;
      }
      else if (!str_cmp (arg, "combat"))
      {
	 inpart = COMBAT;
	 cost = 500000;
      }
      else if (!str_cmp (arg, "spirit"))
      {
	 inpart = SPIRIT;
	 cost = 500000;
      }
      else if (!str_cmp (arg, "awareness"))
      {
	 inpart = AWARE;
	 cost = 500000;
      }
      else
      {
	 do_learn (ch, "");
	 return;
      }
   }
   else if (!str_cmp (arg1, "chi"))
   {
      inpart = MAXIMUM;
      cost = (ch->chi[inpart] + 1) * 1000000;
   }
   else
   {
      do_learn (ch, "");
      return;
   }

   if (!str_cmp (arg1, "abilities"))
   {
      if (!str_cmp (arg, "body") && (ch->monkab[BODY] >= 5))
      {
	 stc ("You already have learned all you can in this ability.\n\r",
	      ch);
	 return;
      }
      if (!str_cmp (arg, "combat") && (ch->monkab[COMBAT] >= 4))
      {
	 stc ("You already have learned all you can in this ability.\n\r",
	      ch);
	 return;
      }
      if (!str_cmp (arg, "spirit") && (ch->monkab[SPIRIT] >= 4))
      {
	 stc ("You already have learned all you can in this ability.\n\r",
	      ch);
	 return;
      }
      if (!str_cmp (arg, "awareness") && (ch->monkab[AWARE] >= 5))
      {
	 stc ("You already have learned all you can in this ability.\n\r",
	      ch);
	 return;
      }
/*
        if (ch->monkab[inpart] >= 5)
	{

	  stc("You have already learned all you can in this ability.\n\r",ch);
	  return;
	}
*/
      if (ch->exp < cost)
      {
	 send_to_char
	    ("You do not have enough experience to learn that power.\n\r",
	     ch);
	 return;
      }

      ch->monkab[inpart]++;
      ch->exp -= cost;
      send_to_char ("Ok.\n\r", ch);
      save_char_obj (ch);
      return;
   }

   else if (!str_cmp (arg1, "chi"))
   {
      if (ch->chi[MAXIMUM] >= 6)
      {
	 stc ("You have already mastered your ch'i.\n\r", ch);
	 return;
      }

      if (ch->exp < cost)
      {
	 sprintf (buf,
		  "You need %d experience to gain the next level of mastery of your ch'i.",
		  cost);
	 return;
      }

      ch->exp -= cost;
      ch->chi[MAXIMUM]++;
      save_char_obj (ch);
      stc ("You gain more control over your ch'i.\n\r", ch);
      return;
   }
   else
   {
      if (IS_FS (ch, inpart))
      {
	 send_to_char ("You have already got that power.\n\r", ch);
	 return;
      }
      if (ch->exp < cost)
      {
	 send_to_char
	    ("You do not have enough experience to learn that power.\n\r",
	     ch);
	 return;
      }

      SET_BIT (ch->monkstuff, inpart);
      ch->exp -= cost;
      send_to_char ("Ok.\n\r", ch);
      save_char_obj (ch);
      return;
   }
}

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

   if (IS_NPC (ch))
      return;

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

   if (ch->monkab[SPIRIT] < 1)
   {
      stc ("Your spirit is far too weak.\n\r", ch);
      stc ("You need a level one mastery of the Spirit to use Blinding Agony.\n\r", ch);
      return;
   }

   if (arg[0] == '\0')
   {
      stc ("Who do you wish to use Blinding Agony on?\n\r", ch);
      return;
   }

   if (ch->move < 200)
   {
      stc ("You are far too exhausted to use Blinding Agony.\n\r", ch);
      stc ("Try getting 200 movement points.\n\r", ch);
      return;
   }

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

   if (is_safe (ch, victim))
      return;

   if (IS_SET (victim->flag2, AFF_TOTALBLIND))
   {
      act ("You hurl a ball of blinding light at $N.", ch, NULL, victim,
	   TO_CHAR);
      act ("$n hurls a ball of blinding light at you.", ch, NULL, victim,
	   TO_VICT);
      act ("$n hurls a ball of blinding light at $N.", ch, NULL, victim,
	   TO_ROOM);
      stc ("Nothing happens.\n\r", ch);
      ch->move -= 100;
      return;
   }

   else
   {
      act ("You hurl a ball of blinding light at $N.", ch, NULL, victim,
	   TO_CHAR);
      act ("$n hurls a ball of blinding light at you.", ch, NULL, victim,
	   TO_VICT);
      act ("$n hurls a ball of blinding light at $N.", ch, NULL, victim,
	   TO_ROOM);
      SET_BIT (victim->flag2, AFF_TOTALBLIND);
      ch->move -= 200;
      stc ("The searing heat of the ball blinds you.\n\r", victim);
      return;
   }

   return;

}

//Monk rEVEREND Command

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

   CHAR_DATA *victim;
   char arg[MAX_STRING_LENGTH];

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;
   if (!IS_CLASS (ch, CLASS_MONK))
   {
      do_rand_typo (ch);
      return;
   }

   if (ch->pcdata->stats[UNI_GEN] > 2)
   {
      do_rand_typo (ch);
      return;
   }

   if (strlen (ch->clan) < 3)
   {
      stc ("You have no monastry.\n\r", ch);
      return;
   }
   if (arg[0] == '\0')
   {
      stc ("Reverend who?\n\r", ch);
      return;
   }
   if ((victim = get_char_room (ch, arg)) == NULL)
   {
      send_to_char ("They are not here.\n\r", ch);
      return;
   }

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

   if (!IS_CLASS (victim, CLASS_MONK))
   {
      stc ("But they are not a monk!\n\r", ch);
      return;
   }

   if (str_cmp (victim->clan, ch->clan))
   {
      send_to_char ("They are not of your Monastry\n\r", ch);
      return;
   }
   if (ch == victim)
   {
      send_to_char ("You can't do that.\n\r", ch);
      return;
   }

   if (IS_SET (victim->special, SPC_PRINCE))
   {
      REMOVE_BIT (victim->special, SPC_PRINCE);
      send_to_char ("You are no longer a Reverend.\n\r", victim);
      send_to_char ("They are no longer a Reverend.\n\r", ch);
      save_char_obj (victim);
      return;
   }

   SET_BIT (victim->special, SPC_PRINCE);
   send_to_char ("You are now a Reverend!\n\r", victim);
   send_to_char ("You make them a Reverend!.\n\r", ch);
   save_char_obj (victim);
   return;
}