cotn/notes/
cotn/src/
/***************************************************************************
 *  Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer,        *
 *  Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe.   *
 *                                                                         *
 *  Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael          *
 *  Chastain, Michael Quan, and Mitchell Tse.                              *
 *                                                                         *
 *  In order to use any part of this Merc Diku Mud, you must comply with   *
 *  both the original Diku license in 'license.doc' as well the Merc       *
 *  license in 'license.txt'.  In particular, you may not remove either of *
 *  these copyright notices.                                               *
 *                                                                         *
 *  Dystopia Mud improvements copyright (C) 2000, 2001 by Brian Graversen  *
 *                                                                         *
 *  Much time and thought has gone into this software and you are          *
 *  benefitting.  We hope that you share your changes too.  What goes      *
 *  around, comes around.                                                  *
 ***************************************************************************/
 /***************************************************************************
 *                                 _/                            _/        *
 *      _/_/_/  _/_/      _/_/_/  _/    _/_/    _/    _/    _/_/_/         *
 *     _/    _/    _/  _/        _/  _/    _/  _/    _/  _/    _/          *
 *    _/    _/    _/  _/        _/  _/    _/  _/    _/  _/    _/           *
 *   _/    _/    _/    _/_/_/  _/    _/_/      _/_/_/    _/_/_/            *
 ***************************************************************************
 * Mindcloud Copyright 2001-2003 by Jeff Boschee (Zarius),                 *
 * Additional credits are in the help file CODECREDITS                     *
 * All Rights Reserved.                                                    *
 ***************************************************************************/

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

void do_monkarmor(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_IMMORTAL(ch))
        {
                if (!IS_CLASS(ch, CLASS_MONK))
                {
                        send_to_char("What?\n\r", ch);
                        return;
                }
        }
        if (arg[0] == '\0')
        {
                send_to_char
                        ("Please specify which piece of monk armor you wish to make: Ring Collar Robe\n\r"
                         "Helmet Shorts Boots Gloves Sleeves Cloak Belt Bracer Mask.\n\r",
                         ch);
                return;
        }
        if (ch->practice < 60)
        {
                send_to_char
                        ("It costs 60 points of primal to create monk equipment.\n\r",
                         ch);
                return;
        }
        if (!str_cmp(arg, "bracer"))
                vnum = 33029;
        else if (!str_cmp(arg, "cloak"))
                vnum = 33027;
        else if (!str_cmp(arg, "gloves"))
                vnum = 33025;
        else if (!str_cmp(arg, "ring"))
                vnum = 33020;
        else if (!str_cmp(arg, "collar"))
                vnum = 33021;
        else if (!str_cmp(arg, "robe"))
                vnum = 33022;
        else if (!str_cmp(arg, "helmet"))
                vnum = 33024;
        else if (!str_cmp(arg, "boots"))
                vnum = 33031;
        else if (!str_cmp(arg, "shorts"))
                vnum = 33023;
        else if (!str_cmp(arg, "sleeves"))
                vnum = 33026;
        else if (!str_cmp(arg, "belt"))
                vnum = 33028;
        else if (!str_cmp(arg, "mask"))
                vnum = 33030;
        else
        {
                do_monkarmor(ch, "");
                return;
        }
        if (vnum == 0 || (pObjIndex = get_obj_index(vnum)) == NULL)
        {
                send_to_char("Missing object, please inform a God.\n\r", ch);
                return;
        }
        obj = create_object(pObjIndex, 50);
        obj->questowner = str_dup(ch->pcdata->switchname);
        obj->ownerid = ch->pcdata->playerid;
        obj_to_char(obj, ch);
        ch->practice -= 60;
        act("$p appears in your hands.", ch, obj, NULL, TO_CHAR);
        act("$p appears in $n's hands.", ch, obj, NULL, TO_ROOM);
        return;
}

void do_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, NULL, arg)) == NULL)
        {
                send_to_char("They are not here.\n\r", ch);
                return;
        }
        if (IS_NPC(victim))
        {
                send_to_char("Not on mobiles.\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;
        }
        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;
}

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->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, NULL, arg)) == NULL)
        {
                send_to_char("They are not here.\n\r", ch);
                return;
        }
        if (IS_NPC(victim))
        {
                send_to_char("Not on mobiles.\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_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);
                ch->damroll -= 200;
                ch->hitroll -= 200;
                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->damroll += 200;
        ch->hitroll += 200;
        ch->move -= 25;
        stc("Your body pulses with spiritual energy.\n\r", ch);
        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;
        }
        ch->chi[CURRENT]--;
        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
                {
                        xprintf(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);
        ch->chi[CURRENT]++;
        ch->move -= ((ch->chi[CURRENT] * 20));
        return;
}

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

        if (ch->pcdata->powers[PMONK] < 9)
        {
                stc("You do not yet have this ability\n\r", ch);
                return;
        }

        if (IS_ITEMAFF(ch, ITEMA_CHAOSHANDS))
        {
                if (IS_ITEMAFF(ch, ITEMA_FIRESHIELD))
                        REMOVE_BIT(ch->itemaffect, ITEMA_FIRESHIELD);
                if (IS_ITEMAFF(ch, ITEMA_ACIDSHIELD))
                        REMOVE_BIT(ch->itemaffect, ITEMA_ACIDSHIELD);
                if (IS_ITEMAFF(ch, ITEMA_SHOCKSHIELD))
                        REMOVE_BIT(ch->itemaffect, ITEMA_SHOCKSHIELD);
                if (IS_ITEMAFF(ch, ITEMA_ICESHIELD))
                        REMOVE_BIT(ch->itemaffect, ITEMA_ICESHIELD);
                if (IS_ITEMAFF(ch, ITEMA_CHAOSSHIELD))
                        REMOVE_BIT(ch->itemaffect, ITEMA_CHAOSSHIELD);
                REMOVE_BIT(ch->itemaffect, ITEMA_CHAOSHANDS);
                act("The swirling colors around your hands disappear.", ch,
                    NULL, NULL, TO_CHAR);
                act("The swirling colors around $n's hands disappear.", ch,
                    NULL, NULL, TO_ROOM);
                return;
        }
        else
        {
                if (!IS_ITEMAFF(ch, ITEMA_FIRESHIELD))
                        SET_BIT(ch->itemaffect, ITEMA_FIRESHIELD);
                if (!IS_ITEMAFF(ch, ITEMA_ACIDSHIELD))
                        SET_BIT(ch->itemaffect, ITEMA_ACIDSHIELD);
                if (!IS_ITEMAFF(ch, ITEMA_SHOCKSHIELD))
                        SET_BIT(ch->itemaffect, ITEMA_SHOCKSHIELD);
                if (!IS_ITEMAFF(ch, ITEMA_ICESHIELD))
                        SET_BIT(ch->itemaffect, ITEMA_ICESHIELD);
                if (!IS_ITEMAFF(ch, ITEMA_CHAOSSHIELD))
                        SET_BIT(ch->itemaffect, ITEMA_CHAOSSHIELD);
                SET_BIT(ch->itemaffect, ITEMA_CHAOSHANDS);
                act("Swirling colors appear around your hands bringing up shields.", ch, NULL, NULL, TO_CHAR);
                act("Swirling colors appear around $n's hands.", ch, NULL,
                    NULL, TO_ROOM);
                return;
        }
}

void do_guide(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))
        {
                send_to_char("Huh?\n\r", ch);
                return;
        }
        if (arg[0] == '\0')
        {
                send_to_char("Guide whom?\n\r", ch);
                return;
        }
        if ((victim = get_char_room(ch, NULL, 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 (IS_CLASS(victim, CLASS_MONK))
        {
                send_to_char("They are already guided.\n\r", ch);
                return;
        }

        if (victim->level != LEVEL_AVATAR)
        {
                send_to_char("You can only guide avatars.\n\r", ch);
                return;
        }
        if (victim->class != 0)
        {
                send_to_char("They already have a class.\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);
        victim->level = LEVEL_AVATAR;
        if (victim->trust > 3)
                victim->trust = victim->trust;
        else
                victim->trust = LEVEL_AVATAR;
        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;
        save_char_obj(ch);
        save_char_obj(victim);
        return;
}

void do_mantra(CHAR_DATA * ch, char *argument)
{
        char      arg1[MAX_INPUT_LENGTH];
        char      arg2[MAX_INPUT_LENGTH];
        char      buf[MAX_STRING_LENGTH];

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

        if (IS_NPC(ch))
                return;
        if (!IS_CLASS(ch, CLASS_MONK))
        {
                send_to_char("Huh?\n\r", ch);
                return;
        }
        if (arg1[0] == '\0' && arg2[0] == '\0')
        {
                xprintf(buf, "Mantras Learned (%d).\n\r",
                        ch->pcdata->powers[PMONK]);
                send_to_char(buf, ch);
                send_to_char("Powers you have:\n\r", ch);
                if (ch->pcdata->powers[PMONK] < 1)
                        send_to_char
                                ("You have no knowledge of any Mantras.\n\r",
                                 ch);
                if (ch->pcdata->powers[PMONK] >= 1)
                        send_to_char("Eyes of God.\n\r", ch);
                if (ch->pcdata->powers[PMONK] >= 2)
                        send_to_char("Shield/Read Aura/Scry\n\r", ch);
                if (ch->pcdata->powers[PMONK] >= 3)
                        send_to_char("Sacred Invisibility\n\r", ch);
                if (ch->pcdata->powers[PMONK] >= 4)
                        send_to_char("Wrath of God\n\r", ch);
                if (ch->pcdata->powers[PMONK] >= 5)
                        send_to_char("Adamantium Hands\n\r", ch);
                if (ch->pcdata->powers[PMONK] >= 6)
                        send_to_char("Skin of Steel\n\r", ch);
                if (ch->pcdata->powers[PMONK] >= 7)
                        send_to_char("The Almighty Favor\n\r", ch);
                if (ch->pcdata->powers[PMONK] >= 8)
                        send_to_char("Dark Blaze\n\r", ch);
                if (ch->pcdata->powers[PMONK] >= 9)
                        send_to_char("Chaos Hands\n\r", ch);
                if (ch->pcdata->powers[PMONK] >= 10)
                        send_to_char("Prayer of the Ages\n\r", ch);
                if (ch->pcdata->powers[PMONK] >= 11)
                        send_to_char("Cloak of Life\n\r", ch);
                if (ch->pcdata->powers[PMONK] >= 12)
                        send_to_char("Gods Heal.\n\r", ch);
                if (ch->pcdata->powers[PMONK] >= 13)
                        send_to_char("Gods Hold.\n\r", ch);
                if (ch->pcdata->powers[PMONK] >= 14)
                        send_to_char
                                ("You have completed your Mantra training.\n\r",
                                 ch);
                return;
        }
        if (!str_cmp(arg2, "improve"))
        {
                int       improve;
                int       cost;
                int       max;

                if (!str_cmp(arg1, "power"))
                {
                        improve = PMONK;
                        max = 14;
                }
                else
                {
                        send_to_char("________________________________\n\r",
                                     ch);
                        send_to_char("|                               |\n\r",
                                     ch);
                        send_to_char("|             Mantras           |\n\r",
                                     ch);
                        send_to_char("|_______________________________|\n\r",
                                     ch);
                        send_to_char("| 1.        Eye of God          |\n\r",
                                     ch);
                        send_to_char("| 2.   Shield/Read Aura/Scry    |\n\r",
                                     ch);
                        send_to_char("| 3.    Sacred Invisibility     |\n\r",
                                     ch);
                        send_to_char("| 4.       Wrath of God         |\n\r",
                                     ch);
                        send_to_char("| 5.     Adamantium Hands       |\n\r",
                                     ch);
                        send_to_char("| 6.       Flaming Hands        |\n\r",
                                     ch);
                        send_to_char("| 7.       Skin of Steel        |\n\r",
                                     ch);
                        send_to_char("| 8.    The Almighty's Favor    |\n\r",
                                     ch);
                        send_to_char("| 9.        Dark Blaze          |\n\r",
                                     ch);
                        send_to_char("| 10.     Celestial Path        |\n\r",
                                     ch);
                        send_to_char("| 11.   Pray of the Ages        |\n\r",
                                     ch);
                        send_to_char("| 12.     Cloak of Life         |\n\r",
                                     ch);
                        send_to_char("| 13.      God's heal           |\n\r",
                                     ch);
                        send_to_char("| 14.      God's hold           |\n\r",
                                     ch);
                        send_to_char("|_______________________________|\n\r",
                                     ch);
                        return;
                }

                cost = (ch->pcdata->powers[improve] + 1) * 10;
                arg1[0] = UPPER(arg1[0]);
                if (ch->pcdata->powers[improve] >= max)
                {
                        xprintf(buf,
                                "You have already gained all the known Mantras.\n\r");
                        send_to_char(buf, ch);
                        return;
                }
                if (cost > ch->practice)
                {
                        xprintf(buf,
                                "It costs you %d primal learn the Mantra.\n\r",
                                cost);
                        send_to_char(buf, ch);
                        return;
                }

                ch->pcdata->powers[improve] += 1;
                ch->practice -= cost;
                xprintf(buf, "You learn a Mantra.\n\r");
                send_to_char(buf, ch);
        }
        else
                send_to_char
                        ("To learn a Mantra, type: Mantra power improve.\n\r",
                         ch);
        return;
}

void do_cloak(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->pcdata->powers[PMONK] < 11)
        {
                send_to_char
                        ("You do not have the mantra of the Cloak of Life.\n\r",
                         ch);
                return;
        }
        if (ch->move < 1000)
        {
                send_to_char
                        ("You do not have enough vitality to do that.\n\r",
                         ch);
                return;
        }
        if (IS_SET(ch->newbits, NEW_MONKCLOAK))
        {
                REMOVE_BIT(ch->newbits, NEW_MONKCLOAK);
                send_to_char
                        ("You are no longer protected by the Almighty's cloak.\n\r",
                         ch);
                act("$n is no longer protected by the Almighty's cloak of life.\n\r", ch, NULL, NULL, TO_ROOM);
                return;
        }
        if (!IS_SET(ch->newbits, NEW_MONKCLOAK))
        {
                SET_BIT(ch->newbits, NEW_MONKCLOAK);
                send_to_char("You are protected by the Almighty's cloak.\n\r",
                             ch);
                act("$n is protected by the Almighty's cloak of life.\n\r",
                    ch, NULL, NULL, TO_ROOM);
                ch->move = ch->move - 1000;
                return;
        }
}

void do_prayofages(CHAR_DATA * ch, char *argument)
{
        CHAR_DATA *victim;
        AFFECT_DATA af;

        if (IS_NPC(ch))
                return;
        if (!IS_CLASS(ch, CLASS_MONK))
        {
                send_to_char("Huh?\n\r", ch);
                return;
        }
        if (ch->pcdata->powers[PMONK] < 11)
        {
                send_to_char
                        ("You must obtain level 11 in mantras to use Prayer of Ages.\n\r",
                         ch);
                return;
        }
        if ((victim = ch->fighting) == NULL)
        {
                send_to_char("You aren't fighting anyone.\n\r", ch);
                return;
        }
        if (IS_AFFECTED(victim, AFF_CURSE))
        {
                send_to_char("They are already cursed.\n\r", ch);
                return;
        }

        af.type = skill_lookup("curse");
        af.duration = 30;
        af.location = APPLY_HITROLL;
        af.modifier = -10;
        af.bitvector = AFF_CURSE;
        affect_to_char(victim, &af);
        send_to_char("You feel unclean.\n\r", victim);

        send_to_char
                ("You pray to god, cursing your nemesis with his divine wrath.\n\r",
                 ch);
        WAIT_STATE(ch, 8);
        return;
}

void do_sacredinvis(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->pcdata->powers[PMONK] < 3)
        {
                send_to_char
                        ("You do not have the mantra of Sacred Invisibility.\n\r",
                         ch);
                return;
        }
        if (IS_SET(ch->act, AFF_HIDE))
        {
                REMOVE_BIT(ch->act, AFF_HIDE);
                send_to_char
                        ("You emerge from your cloak of invisibility.\n\r",
                         ch);
                act("$n slowly emerges from a cloak of holy invisibility.",
                    ch, NULL, NULL, TO_ROOM);
        }
        else
        {
                if (ch->fight_timer > 0)
                {
                        send_to_char
                                ("Not until your fight timer expires.\n\r",
                                 ch);
                        return;
                }
                if (ch->move < 500)
                {
                        send_to_char
                                ("You do not have enough movement to do this.\n\r",
                                 ch);
                        return;
                }
                send_to_char
                        ("You slowly fade into a cloak of invisibility.\n\r",
                         ch);
                act("$n slowly fades into a cloak of holy invisibility..", ch,
                    NULL, NULL, TO_ROOM);
                SET_BIT(ch->act, AFF_HIDE);
                ch->move -= 500;
        }
        return;
}

void do_flaminghands(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->pcdata->powers[PMONK] < 5)
        {
                send_to_char
                        ("You do not have the mantra of Flaming Hands.\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->pcdata->powers[PMONK] < 10)
        {
                send_to_char
                        ("You must obtain level 10 in mantras 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 (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)
        {
                stc("Not to yourself.\n\r", ch);
                return;
        }
        if (IS_SET(victim->in_room->room_flags, ROOM_ASTRAL))
        {
                stc("You can't find it's room.\n\r", ch);
                return;
        }
        if (IS_SET(ch->in_room->room_flags, ROOM_ASTRAL))
        {
                stc("Your room is not connected to the astral plane.\n\r",
                    ch);
                return;
        }
        if (!IS_NPC(victim) && !IS_IMMUNE(victim, IMM_SUMMON))
        {
                send_to_char("There summon is off!\n\r", ch);
                return;
        }
        if (IS_SET(victim->act, ACT_NOTRAVEL))
        {
                send_to_char("No Can Do.\n\r", ch);
                return;
        }
        if (room_is_private(victim->in_room))
        {
                send_to_char("That room is private right now.\n\r", ch);
                return;
        }
        if (ch == victim)
        {
                send_to_char("But you're already at yourself!\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))
        {
                xprintf(buf,
                        "You concentrate and open a Celestial path to %s!\n\r",
                        victim->short_descr);
                send_to_char(buf, ch);
        }
        if (!IS_NPC(victim))
        {
                xprintf(buf,
                        "You concentrate and open a Celestial path to %s!\n\r",
                        victim->name);
                send_to_char(buf, ch);
        }
        act("$n appears before you through a Celestial portal!\n\r", ch, NULL,
            NULL, TO_ROOM);
        do_look(ch, "auto");
        ch->move -= 250;
        return;
}

void do_godseye(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->pcdata->powers[PMONK] < 1)
        {
                send_to_char
                        ("You have not learned the Eyes of God Mantra.\n\r",
                         ch);
                return;
        }
        if (IS_SET(ch->act, PLR_HOLYLIGHT))
        {
                REMOVE_BIT(ch->act, PLR_HOLYLIGHT);
                send_to_char("Your view shimmers into mortal vision.\n\r",
                             ch);
        }
        else
        {
                send_to_char
                        ("God answers your prayers and gives you his vision.\n\r",
                         ch);
                SET_BIT(ch->act, PLR_HOLYLIGHT);
        }
        return;
}

void do_steelskin(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->pcdata->powers[PMONK] < 6)
        {
                send_to_char
                        ("You have not learned the Steel of Skin Mantra.\n\r",
                         ch);
                return;
        }
        if (IS_SET(ch->newbits, NEW_MONKSKIN))
        {
                REMOVE_BIT(ch->newbits, NEW_MONKSKIN);
                send_to_char("Your steel shield disappears.\n\r", ch);
        }
        else
        {
                send_to_char("You are surrounded by a steel shield\n\r", ch);
                SET_BIT(ch->newbits, NEW_MONKSKIN);
        }
        return;
}

void do_godsbless(CHAR_DATA * ch, char *argument)
{
        int       sn;
        int       level;
        int       spelltype;

        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] < 7)
        {
                send_to_char
                        ("You have not learned the Almighty Favor Mantra.\n\r",
                         ch);
                return;
        }
        if (ch->mana < 3000)
        {
                send_to_char("You don't have enough mana.\n\r", ch);
                return;
        }
        if ((sn = skill_lookup("godbless")) < 0)
                return;
        spelltype = skill_table[sn].target;
        level = 500;
        (*skill_table[sn].spell_fun) (sn, level, ch, ch);
        WAIT_STATE(ch, 12);
        ch->mana = ch->mana - 3000;
        return;
}


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

        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] < 4)
        {
                send_to_char
                        ("You have not learned to call on the wrath of god yet.\n\r",
                         ch);
                return;
        }
        if (ch->fighting != NULL)
                victim = ch->fighting;
        else
                return;
        if (!IS_NPC(victim))
                return;
        one_hit(ch, victim, gsn_wrathofgod, 1);
        one_hit(ch, victim, gsn_wrathofgod, 1);
        one_hit(ch, victim, gsn_wrathofgod, 1);
        one_hit(ch, victim, gsn_wrathofgod, 1);
        WAIT_STATE(ch, 8);
        return;
}


void do_godsfavor(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] < 8)
        {
                send_to_char
                        ("You have not learned the Almighty's Favor Mantra.\n\r",
                         ch);
                return;
        }
        if (ch->move < 1500)
        {
                send_to_char("You do not have the vitality to do that!\n\r",
                             ch);
                return;
        }
        if (!IS_SET(ch->newbits, NEW_MONKFAVOR))
        {
                SET_BIT(ch->newbits, NEW_MONKFAVOR);
                send_to_char
                        ("God smiles upon you and you feel strengthened.\n\r",
                         ch);
                act("$n is blessed by the Almighty.", ch, NULL, NULL,
                    TO_ROOM);
                ch->move = ch->move - 1500;
                WAIT_STATE(ch, 4);
                return;
        }
        if (IS_SET(ch->newbits, NEW_MONKFAVOR))
        {
                REMOVE_BIT(ch->newbits, NEW_MONKFAVOR);
                send_to_char
                        ("You feel weaker as The Almighty's favor leaves you.\n\r",
                         ch);
                act("$n no longer looks so holy.", ch, NULL, NULL, TO_ROOM);
                return;
        }
}

void do_darkblaze(CHAR_DATA * ch, char *argument)
{
        CHAR_DATA *victim;
        AFFECT_DATA af;


        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] < 8)
        {
                send_to_char
                        ("You have not learned the Dark Blaze Mantra.\n\r",
                         ch);
                return;
        }
        if (ch->fighting != NULL)
                victim = ch->fighting;
        else
                return;
        if (IS_SET(victim->act, PLR_HOLYLIGHT))
        {
                REMOVE_BIT(victim->act, PLR_HOLYLIGHT);
        }
        if (IS_SET(victim->affected_by, AFF_DETECT_HIDDEN))
                REMOVE_BIT(victim->affected_by, AFF_DETECT_HIDDEN);
        if (IS_SET(victim->affected_by, AFF_DETECT_INVIS))
                REMOVE_BIT(victim->affected_by, AFF_DETECT_INVIS);
        af.type = skill_lookup("blindness");
        af.location = APPLY_HITROLL;
        af.modifier = -4;
        af.duration = 60;
        af.bitvector = AFF_BLIND;
        affect_to_char(victim, &af);
        send_to_char("Your hands blaze up, blinding your opponent.\n\r", ch);
        send_to_char
                ("Your opponents hands flashes with a blinding light.\n\r",
                 victim);
        WAIT_STATE(ch, 18);
        return;
}


void do_godsheal(CHAR_DATA * ch, char *argument)
{
        if (IS_NPC(ch))
                return;
        if (!IS_CLASS(ch, CLASS_MONK))
        {
                stc("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;
                if (ch->hit > ch->max_hit)
                        ch->hit = ch->max_hit;
                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;
                if (ch->hit > ch->max_hit)
                        ch->hit = ch->max_hit;
                ch->mana -= 400;
                WAIT_STATE(ch, 8);
                return;
        }
}

void do_ghold(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] < 13)
        {
                send_to_char("You need Mantra 13 to use gods hold.\n\r", ch);
                return;
        }
        if (!IS_SET(ch->newbits, NEW_JAWLOCK))
        {
                send_to_char
                        ("God joins you at your side to hold your foe.\n\r",
                         ch);
                SET_BIT(ch->newbits, NEW_JAWLOCK);
                return;
        }
        else if (IS_SET(ch->newbits, NEW_JAWLOCK))
        {
                send_to_char("God leaves your side.\n\r", ch);
                REMOVE_BIT(ch->newbits, NEW_JAWLOCK);
                return;
        }
}