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"

/*
 * Local functions.
 */

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

        one_argument(argument, arg);

        if (IS_NPC(ch))
                return;

        if (IS_IMMUNE(ch, IMM_TRAVEL))
        {
                REMOVE_BIT(ch->immune, IMM_TRAVEL);
                send_to_char
                        ("You can now be the target of travel or burrow.\n\r",
                         ch);
                return;
        }
        else if (!IS_IMMUNE(ch, IMM_TRAVEL))
        {
                SET_BIT(ch->immune, IMM_TRAVEL);
                send_to_char
                        ("You can no longer be the target of travel or burrow.\n\r",
                         ch);
                return;
        }
        else
                send_to_char("Excuse you?\n\r", ch);
        return;
}



void do_warps(CHAR_DATA * ch, char *argument)
{
        char      lin[MAX_STRING_LENGTH];


        if (IS_NPC(ch))
                return;
        if (!IS_CLASS(ch, CLASS_DEMON))
        {
                send_to_char("Huh?\n\r", ch);
                return;
        }
        xprintf(lin,
                "-=(**)=-=(**)=-=(**)=-=(**)=-=(**)=-=(**)=-=(**)=-=(**)=-=(**)=-=(**)=-=(**)=-\n\r");
        send_to_char(lin, ch);
        send_to_char
                ("                      -=(**)=- Attained Warps -=(**)=-\n\r",
                 ch);
        send_to_char(lin, ch);
        if (IS_SET(ch->warp, WARP_CBODY))
                send_to_char
                        ("Your body is protected by a indestructable crystal shell.\n\r",
                         ch);
        if (IS_SET(ch->warp, WARP_SBODY))
                send_to_char("Your skin is as hard as steel.\n\r", ch);
        if (IS_SET(ch->warp, WARP_STRONGARMS))
                send_to_char("Your arms are incredibly strong.\n\r", ch);
        if (IS_SET(ch->warp, WARP_STRONGLEGS))
                send_to_char("Your legs are incredibly strong.\n\r", ch);
        if (IS_SET(ch->warp, WARP_VENOMTONG))
                send_to_char("Your tongue is long and venomous.\n\r", ch);
        if (IS_SET(ch->warp, WARP_SPIKETAIL))
                send_to_char
                        ("Your tail fires deadly spikes during combat.\n\r",
                         ch);
        if (IS_SET(ch->warp, WARP_BADBREATH))
                send_to_char("Your breath is putrid and deadly.\n\r", ch);
        if (IS_SET(ch->warp, WARP_QUICKNESS))
                send_to_char("You have incredible speed.\n\r", ch);
        if (IS_SET(ch->warp, WARP_STAMINA))
                send_to_char
                        ("You have increased stamina, reducing the damage you take.\n\r",
                         ch);
        if (IS_SET(ch->warp, WARP_HUNT))
                send_to_char
                        ("Your heightened senses enable you to hunt people.\n\r",
                         ch);
        if (IS_SET(ch->warp, WARP_DEVOUR))
                send_to_char
                        ("You have the ability to devour your opponents, sending them into the pits of Hell.\n\r",
                         ch);
        if (IS_SET(ch->warp, WARP_TERROR))
                send_to_char
                        ("Your features are so horrid that they may stun those who look at you.\n\r",
                         ch);
        if (IS_SET(ch->warp, WARP_REGENERATE))
                send_to_char
                        ("Your body has the ability to regenerate incredibly fast.\n\r",
                         ch);
        if (IS_SET(ch->warp, WARP_STEED))
                send_to_char("Your mounts transform into hideous Demons.\n\r",
                             ch);
        if (IS_SET(ch->warp, WARP_WEAPON))
                send_to_char
                        ("You have the power to transform into a deadly battle axe.\n\r",
                         ch);
        if (IS_SET(ch->warp, WARP_INFIRMITY))
                send_to_char
                        ("Your body has been afflicted by a terrible infirmity.\n\r",
                         ch);
        if (IS_SET(ch->warp, WARP_GBODY))
                send_to_char("Your skin is made of a fragile glass.\n\r", ch);
        if (IS_SET(ch->warp, WARP_SCARED))
                send_to_char("You are incredibly scared of combat.\n\r", ch);
        if (IS_SET(ch->warp, WARP_MAGMA))
                send_to_char("Your body is composed of deadly magma.\n\r",
                             ch);
        if (IS_SET(ch->warp, WARP_WEAK))
                send_to_char("Your muscles are severely weakened.\n\r", ch);
        if (IS_SET(ch->warp, WARP_SLOW))
                send_to_char("Your body moves very slowly.\n\r", ch);
        if (IS_SET(ch->warp, WARP_VULNER))
                send_to_char("Your skin is very vulnerable to magic.\n\r",
                             ch);
        if (IS_SET(ch->warp, WARP_SHARDS))
                send_to_char("Your skin is covered with shards of ice.\n\r",
                             ch);
        if (IS_SET(ch->warp, WARP_WINGS))
                send_to_char
                        ("A pair of leathery wings protrude from your back.\n\r",
                         ch);
        if (IS_SET(ch->warp, WARP_CLUMSY))
                send_to_char
                        ("You are incredibly clumsy, enabling you to be disarmed.\n\r",
                         ch);
        if (IS_SET(ch->warp, WARP_STUPID))
                send_to_char
                        ("Your intelligence is extremely low, preventing you from casting spells.\n\r",
                         ch);
        if (IS_SET(ch->warp, WARP_SPOON))
                send_to_char("There is a spoon stuck on your ear.\n\r", ch);
        if (IS_SET(ch->warp, WARP_FORK))
                send_to_char("You have a fork stuck in your nose.\n\r", ch);
        if (IS_SET(ch->warp, WARP_KNIFE))
                send_to_char("You have a knife hanging out of your ear.\n\r",
                             ch);
        if (IS_SET(ch->warp, WARP_SALADBOWL))
                send_to_char("Your head is made out of a salad bowl.\n\r",
                             ch);
        if (ch->warp < 1)
                send_to_char("You haven't obtained any warp powers.\n\r", ch);
        send_to_char(lin, ch);
        return;
}

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

        argument = one_argument(argument, arg);

        if (IS_NPC(ch))
                return;
        if (!IS_CLASS(ch, CLASS_DEMON))
        {
                send_to_char("Huh?\n\r", ch);
                return;
        }
        if (!IS_DEMPOWER(ch, DEM_DAMN) && IS_CLASS(ch, CLASS_DEMON))
        {
                send_to_char
                        ("You haven't been granted the gift of damning.\n\r",
                         ch);
                return;
        }

        if (!TIME_UP(ch, TIMER_DAMN) && ch->level < 12)
        {
                send_to_char
                        ("This ability can only be used once every 3 hours.\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 (ch == victim && ch->fighting != NULL)
        {
                send_to_char("You cannot damn yourself while fighting!\n\r",
                             ch);
                return;
        }

        if (ch == victim && ch->fighting == NULL)
        {
                send_to_char("You return to hell!\n\r", ch);
                char_from_room(ch);
                char_to_room(ch, get_room_index(93425));
                do_look(ch, "auto");
                return;
        }

        in_room = ch->in_room;

        if (ch->in_room == get_room_index(93425))
        {
                stc("#RAlready there!!#n\n\r", ch);
                return;
        }

        if (ch->fighting == NULL)
        {
                stc("#rYou're not engaged in combat with them!#n\n\r", ch);
                return;
        }


        stc("#0You attempt to focus your hatred...#n\n\r", ch);

        if ((number_range(1, 3) == 1) && (ch->fighting != NULL))
        {
                if (ch->fighting)
                {
                        stop_fighting(ch, TRUE);
                }

                do_say(ch, "#RMecca #rlecca #Yhi #rmecca #Rhinie #Who!#n");
                stc("#RYou #rDAMN #Rthem to the pits of hell!#n\n\r", ch);
                char_from_room(victim);
                char_to_room(victim, get_room_index(93425));
                do_look(victim, "auto");

                char_from_room(ch);
                char_to_room(ch, get_room_index(93425));
                stc("#RWelcome to Hell!#n\n\r", victim);
                do_look(ch, "auto");

                set_fighting(ch, victim, 1);
                SET_TIMER(ch, TIMER_ENTOMB, 3);
        }
        WAIT_STATE(ch, 6);
        return;
}


void do_obtain(CHAR_DATA * ch, char *argument)
{
        int       newwarp = 0;
        int       warpnum = number_range(1, 18);

        if (IS_NPC(ch))
                return;

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

        if (ch->pcdata->stats[DEMON_TOTAL] < 15000 ||
            ch->pcdata->stats[DEMON_CURRENT] < 15000)
        {
                send_to_char
                        ("You need 15000 demon points to obtain a new warp!\n\r",
                         ch);
                return;
        }

        if (ch->warpcount >= 18)
        {
                send_to_char
                        ("You have already obtained as many warps as possible.\n\r",
                         ch);
                return;
        }

        if (warpnum == 1)
                newwarp = WARP_CBODY;
        else if (warpnum == 2)
                newwarp = WARP_SBODY;
        else if (warpnum == 3)
                newwarp = WARP_STRONGARMS;
        else if (warpnum == 4)
                newwarp = WARP_STRONGLEGS;
        else if (warpnum == 5)
                newwarp = WARP_VENOMTONG;
        else if (warpnum == 6)
                newwarp = WARP_SPIKETAIL;
        else if (warpnum == 7)
                newwarp = WARP_BADBREATH;
        else if (warpnum == 8)
                newwarp = WARP_QUICKNESS;
        else if (warpnum == 9)
                newwarp = WARP_STAMINA;
        else if (warpnum == 10)
                newwarp = WARP_HUNT;
        else if (warpnum == 11)
                newwarp = WARP_DEVOUR;
        else if (warpnum == 12)
                newwarp = WARP_TERROR;
        else if (warpnum == 13)
                newwarp = WARP_REGENERATE;
        else if (warpnum == 14)
                newwarp = WARP_STEED;
        else if (warpnum == 15)
                newwarp = WARP_WEAPON;
        else if (warpnum == 16)
                newwarp = WARP_MAGMA;
        else if (warpnum == 17)
                newwarp = WARP_SHARDS;
        else if (warpnum == 18)
                newwarp = WARP_WINGS;

        if (IS_SET(ch->warp, newwarp))
        {
                do_obtain(ch, "");
                return;
        }

        SET_BIT(ch->warp, newwarp);
        ch->pcdata->stats[DEMON_CURRENT] -= 15000;
        ch->warpcount += 1;
        send_to_char("You have obtained a new warp!\n\r", ch);
        save_char_obj(ch);
        return;
}

void do_inpart(CHAR_DATA * ch, char *argument)
{
        CHAR_DATA *victim;
        char      arg1[MAX_INPUT_LENGTH];
        char      arg2[MAX_INPUT_LENGTH];
        int       inpart = 0;
        int       cost = 0;

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

        if (IS_NPC(ch))
                return;

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

        if (arg1[0] == '\0' || arg2[0] == '\0')
        {
                send_to_char("Syntax: Inpart <person> <power>\n\r", ch);
                send_to_char
                        (" Fangs        [ 2500] Claws        [ 2500] Tail        [ 5000]\n\r",
                         ch);
                send_to_char
                        (" Horns        [ 2500] Hooves       [ 1500] Graft       [20000]\n\r",
                         ch);
                send_to_char
                        (" NightSight   [ 3000] Wings        [ 1000] Might       [ 7500]\n\r",
                         ch);
                send_to_char
                        (" Toughness    [ 7500] Speed        [ 7500] Travel      [ 1500]\n\r",
                         ch);
                send_to_char
                        (" Scry         [ 7500] Truesight    [ 7500] Move        [  500]\n\r",
                         ch);
                send_to_char
                        (" Leap         [  500] Magic        [ 1000] Lifespan    [  100]\n\r",
                         ch);
                send_to_char
                        (" Shield       [20000] Longsword    [    0] Shortsword  [    0]\n\r",
                         ch);
                send_to_char
                        (" Immolate     [ 2500] Inferno      [20000] Caust       [ 3000]\n\r",
                         ch);
                send_to_char
                        (" Unnerve      [ 5000] Freezeweapon [ 3000] Entomb      [20000]\n\r",
                         ch);
                send_to_char
                        (" Leech        [15000] Demonform    [25000] Blink       [15000]\n\r",
                         ch);
                send_to_char(" Damn         [30000]\n\r", ch);
                return;
        }

        if ((victim = get_char_world(ch, arg1)) == NULL)
        {
                send_to_char("Nobody by that name.\n\r", ch);
                return;
        }


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


        if (!IS_CLASS(victim, CLASS_DEMON))
        {
                send_to_char("Only on demons.\n\r", ch);
                return;
        }

        if (!str_cmp(arg2, "longsword"))
        {
                send_to_char
                        ("You have been granted the power to transform into a demonic longsword!\n\r",
                         victim);
                send_to_char
                        ("You grant them the power to transform into a demonic longsword.\n\r",
                         ch);
                victim->pcdata->powers[DPOWER_OBJ_VNUM] = 33120;
                save_char_obj(victim);
                return;
        }

        if (!str_cmp(arg2, "fangs"))
        {
                inpart = DEM_FANGS;
                cost = 2500;
        }
        else if (!str_cmp(arg2, "immolate"))
        {
                inpart = DEM_IMMOLATE;
                cost = 2500;
        }
        else if (!str_cmp(arg2, "inferno"))
        {
                inpart = DEM_INFERNO;
                cost = 20000;
        }
        else if (!str_cmp(arg2, "caust"))
        {
                inpart = DEM_CAUST;
                cost = 3000;
        }
        else if (!str_cmp(arg2, "freezeweapon"))
        {
                inpart = DEM_FREEZEWEAPON;
                cost = 3000;
        }
        else if (!str_cmp(arg2, "unnerve"))
        {
                inpart = DEM_UNNERVE;
                cost = 5000;
        }
        else if (!str_cmp(arg2, "entomb"))
        {
                inpart = DEM_ENTOMB;
                cost = 20000;
        }
        else if (!str_cmp(arg2, "claws"))
        {
                inpart = DEM_CLAWS;
                cost = 2500;
        }
        else if (!str_cmp(arg2, "horns"))
        {
                inpart = DEM_HORNS;
                cost = 2500;
        }
        else if (!str_cmp(arg2, "demonform"))
        {
                inpart = DEM_FORM;
                cost = 25000;
        }
        else if (!str_cmp(arg2, "damn"))
        {
                inpart = DEM_DAMN;
                cost = 30000;
        }
        else if (!str_cmp(arg2, "tail"))
        {
                inpart = DEM_TAIL;
                cost = 5000;
        }
        else if (!str_cmp(arg2, "hooves"))
        {
                inpart = DEM_HOOVES;
                cost = 1500;
        }
        else if (!str_cmp(arg2, "shield"))
        {
                inpart = DEM_SHIELD;
                cost = 20000;
        }
        else if (!str_cmp(arg2, "nightsight"))
        {
                inpart = DEM_EYES;
                cost = 3000;
        }
        else if (!str_cmp(arg2, "wings"))
        {
                inpart = DEM_WINGS;
                cost = 1000;
        }
        else if (!str_cmp(arg2, "might"))
        {
                inpart = DEM_MIGHT;
                cost = 7500;
        }
        else if (!str_cmp(arg2, "toughness"))
        {
                inpart = DEM_TOUGH;
                cost = 7500;
        }
        else if (!str_cmp(arg2, "speed"))
        {
                inpart = DEM_SPEED;
                cost = 7500;
        }
        else if (!str_cmp(arg2, "travel"))
        {
                inpart = DEM_TRAVEL;
                cost = 1500;
        }
        else if (!str_cmp(arg2, "scry"))
        {
                inpart = DEM_SCRY;
                cost = 7500;
        }
        else if (!str_cmp(arg2, "move"))
        {
                inpart = DEM_MOVE;
                cost = 500;
        }
        else if (!str_cmp(arg2, "leap"))
        {
                inpart = DEM_LEAP;
                cost = 500;
        }
        else if (!str_cmp(arg2, "magic"))
        {
                inpart = DEM_MAGIC;
                cost = 1000;
        }
        else if (!str_cmp(arg2, "truesight"))
        {
                inpart = DEM_TRUESIGHT;
                cost = 7500;
        }
        else if (!str_cmp(arg2, "graft"))
        {
                inpart = DEM_GRAFT;
                cost = 20000;
        }
        else if (!str_cmp(arg2, "leech"))
        {
                inpart = DEM_LEECH;
                cost = 15000;
        }
        else if (!str_cmp(arg2, "blink"))
        {
                inpart = DEM_BLINK;
                cost = 15000;
        }
        else if (!str_cmp(arg2, "lifespan"))
        {
                inpart = DEM_LIFESPAN;
                cost = 100;
        }
        else
        {
                do_inpart(ch, "");
                return;
        }

        if (!(victim == ch))
                cost *= 25;

        if (IS_DEMPOWER(victim, inpart))
        {
                send_to_char("They have already got that power.\n\r", ch);
                return;
        }

        if (!IS_CLASS(victim, CLASS_DEMON))
        {
                stc("You can not inpart this onto nonDemons.\n\r", ch);
                return;
        }

        if (ch->pcdata->stats[DEMON_TOTAL] < cost ||
            ch->pcdata->stats[DEMON_CURRENT] < cost)
        {
                send_to_char
                        ("You have insufficient power to inpart that gift.\n\r",
                         ch);
                return;
        }

        if (!IS_CLASS(victim, CLASS_DEMON) && ch->practice < 100)
        {
                stc("Victim does not have 100 primal.\n\r", ch);
                return;
        }

        SET_BIT(victim->pcdata->powers[DPOWER_FLAGS], inpart);
        ch->pcdata->stats[DEMON_CURRENT] -= cost;
        if (!IS_CLASS(victim, CLASS_DEMON))
                ch->practice -= 100;
        if (victim != ch)
                send_to_char
                        ("You have been granted a demonic gift from your patron!\n\r",
                         victim);
        send_to_char("Ok.\n\r", ch);
        if (victim != ch)
                save_char_obj(ch);
        save_char_obj(victim);
        return;
}

void do_demonarmour(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_DEMON))
        {
                send_to_char("Huh?\n\r", ch);
                return;
        }
        if (arg[0] == '\0')
        {
                send_to_char
                        ("Please specify which piece of demon armor you wish to make: Ring Collar Plate Helmet Leggings Boots\n\r"
                         "Gauntlets Sleeves Cape Belt Bracer Visor longsword shortsword.\n\r",
                         ch);
                return;
        }
        else if (!str_cmp(arg, "ring"))
                vnum = 33122;
        else if (!str_cmp(arg, "collar"))
                vnum = 33123;
        else if (!str_cmp(arg, "plate"))
                vnum = 33125;
        else if (!str_cmp(arg, "helmet"))
                vnum = 33126;
        else if (!str_cmp(arg, "leggings"))
                vnum = 33127;
        else if (!str_cmp(arg, "boots"))
                vnum = 33128;
        else if (!str_cmp(arg, "gauntlets"))
                vnum = 33129;
        else if (!str_cmp(arg, "sleeves"))
                vnum = 33130;
        else if (!str_cmp(arg, "cape"))
                vnum = 33131;
        else if (!str_cmp(arg, "belt"))
                vnum = 33132;
        else if (!str_cmp(arg, "bracer"))
                vnum = 33124;
        else if (!str_cmp(arg, "visor"))
                vnum = 33133;
        else if (!str_cmp(arg, "longsword"))
                vnum = 33120;
        else if (!str_cmp(arg, "shortsword"))
                vnum = 33121;
        else
        {
                do_demonarmour(ch, "");
                return;
        }
        if (ch->practice < 100)
        {
                send_to_char
                        ("It costs 100 points of primal to create a piece of demon armour.\n\r",
                         ch);
                return;
        }

        if (vnum == 0 || (pObjIndex = get_obj_index(vnum)) == NULL)
        {
                send_to_char("Missing object, please inform Jobo.\n\r", ch);
                return;
        }
        ch->practice -= 100;
        obj = create_object(pObjIndex, 50);
        obj->questowner = str_dup(ch->pcdata->switchname);
        obj->ownerid = ch->pcdata->playerid;
        obj_to_char(obj, ch);
        act("$p appears in your hands in a blast of flames.", ch, obj, NULL,
            TO_CHAR);
        act("$p appears in $n's hands in a blast of flames.", ch, obj, NULL,
            TO_ROOM);
        return;
}

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

        argument = one_argument(argument, arg);

        if (IS_NPC(ch))
                return;

        if (IS_CLASS(ch, CLASS_DEMON))
        {
                if (!IS_DEMPOWER(ch, DEM_TRAVEL))
                {
                        send_to_char
                                ("You haven't been granted the gift of travel.\n\r",
                                 ch);
                        return;
                }
        }
        else
        {
                send_to_char("Huh?\n\r", ch);
                return;
        }

        if ((victim = get_char_world(ch, arg)) == NULL)
        {
                send_to_char("Nobody by that name.\n\r", ch);
                return;
        }
        if (IS_SET(victim->act, ACT_NOTRAVEL))
        {
                send_to_char("No Can Do.\n\r", ch);
                return;
        }
        if (IS_IMMUNE(victim, IMM_TRAVEL))
        {
                send_to_char("I don't think they want you to do that.\n\r",
                             ch);
                return;
        }
        if (!IS_NPC(victim) && IS_IMMUNE(victim, IMM_SUMMON))
        {
                send_to_char("I don't think they want you to do that.\n\r",
                             ch);
                return;
        }
        if (victim == ch)
        {
                send_to_char("Nothing happens.\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 (victim->in_room == NULL)
        {
                send_to_char("Nothing happens.\n\r", ch);
                return;
        }
        send_to_char("You sink into the ground.\n\r", ch);
        act("$n sinks into the ground.", ch, NULL, NULL, TO_ROOM);
        char_from_room(ch);
        char_to_room(ch, victim->in_room);
        do_look(ch, "");
        send_to_char("You rise up out of the ground.\n\r", ch);
        act("$n rises up out of the ground.", ch, NULL, NULL, TO_ROOM);
        return;
}

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

        argument = one_argument(argument, arg);

        if (IS_NPC(ch))
                return;

        if (!IS_CLASS(ch, CLASS_VAMPIRE) && !IS_CLASS(ch, CLASS_DEMON))
        {
                send_to_char("Huh?\n\r", ch);
                return;
        }
        if (IS_CLASS(ch, CLASS_DEMON) && ch->power[DISC_DAEM_ATTA] < 4)
        {
                if (!IS_DEMPOWER(ch, DEM_HORNS) && IS_CLASS(ch, CLASS_DEMON))
                {
                        send_to_char
                                ("You haven't been granted the gift of horns or attack is below level 4.\n\r",
                                 ch);
                        return;
                }
        }
        else if (IS_CLASS(ch, CLASS_VAMPIRE)
                 && !IS_VAMPAFF(ch, VAM_VICISSITUDE))
        {
                send_to_char("Use bonemod.\n\r", ch);
                return;
        }

        if (IS_DEMAFF(ch, DEM_HORNS))
        {
                send_to_char("Your horns slide back into your head.\n\r", ch);
                act("$n's horns slide back into $s head.", ch, NULL, NULL,
                    TO_ROOM);
                REMOVE_BIT(ch->pcdata->powers[DPOWER_CURRENT], DEM_HORNS);
                return;
        }
        send_to_char("Your horns extend out of your head.\n\r", ch);
        act("A pair of pointed horns extend from $n's head.", ch, NULL, NULL,
            TO_ROOM);
        SET_BIT(ch->pcdata->powers[DPOWER_CURRENT], DEM_HORNS);
        return;
}
void do_tail(CHAR_DATA * ch, char *argument)
{
        char      arg[MAX_INPUT_LENGTH];

        argument = one_argument(argument, arg);

        if (IS_NPC(ch))
                return;

        if (!IS_CLASS(ch, CLASS_DEMON))
        {
                send_to_char("Huh?\n\r", ch);
                return;
        }
        if (!IS_DEMPOWER(ch, DEM_TAIL))
        {
                send_to_char
                        ("You haven't been granted the gift of a tail.\n\r",
                         ch);
                return;
        }

        if (IS_DEMAFF(ch, DEM_TAIL))
        {
                send_to_char("Your tail slides back into your back.\n\r", ch);
                act("$n's tail slides back into $s back.", ch, NULL, NULL,
                    TO_ROOM);
                REMOVE_BIT(ch->pcdata->powers[DPOWER_CURRENT], DEM_TAIL);
                return;
        }

        send_to_char("Your tail slides out of your back side.\n\r", ch);
        act("A huge tail extends from $n's back.", ch, NULL, NULL, TO_ROOM);
        SET_BIT(ch->pcdata->powers[DPOWER_CURRENT], DEM_TAIL);
        return;
}

/*moved*/
void do_hooves(CHAR_DATA * ch, char *argument)
{
        char      arg[MAX_INPUT_LENGTH];

        argument = one_argument(argument, arg);

        if (IS_NPC(ch))
                return;

        if (!IS_CLASS(ch, CLASS_DEMON))
        {
                send_to_char("Huh?\n\r", ch);
                return;
        }
        if (!IS_DEMPOWER(ch, DEM_HOOVES))
        {
                send_to_char
                        ("You haven't been granted the gift of hooves.\n\r",
                         ch);
                return;
        }

        if (IS_DEMAFF(ch, DEM_HOOVES))
        {
                send_to_char("Your hooves transform into feet.\n\r", ch);
                act("$n's hooves transform back into $s feet.", ch, NULL,
                    NULL, TO_ROOM);
                REMOVE_BIT(ch->pcdata->powers[DPOWER_CURRENT], DEM_HOOVES);
                return;
        }
        send_to_char("Your feet transform into hooves.\n\r", ch);
        act("$n's feet transform into hooves.", ch, NULL, NULL, TO_ROOM);
        SET_BIT(ch->pcdata->powers[DPOWER_CURRENT], DEM_HOOVES);
        return;
}

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

        argument = one_argument(argument, arg);

        if (IS_NPC(ch))
                return;

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


        if (!IS_DEMPOWER(ch, DEM_WINGS) && ch->power[DISC_DAEM_ATTA] < 5
            && IS_CLASS(ch, CLASS_DEMON))
        {
                send_to_char
                        ("You haven't been granted the gift of wings.\n\r",
                         ch);
                return;
        }

        if (arg[0] != '\0')
        {
                if (!IS_DEMAFF(ch, DEM_WINGS))
                {
                        send_to_char
                                ("First you better get your wings out!\n\r",
                                 ch);
                        return;
                }
                if (!str_cmp(arg, "unfold") || !str_cmp(arg, "u"))
                {
                        if (IS_DEMAFF(ch, DEM_UNFOLDED))
                        {
                                send_to_char
                                        ("But your wings are already unfolded!\n\r",
                                         ch);
                                return;
                        }
                        send_to_char
                                ("Your wings unfold from behind your back.\n\r",
                                 ch);
                        act("$n's wings unfold from behind $s back.", ch,
                            NULL, NULL, TO_ROOM);
                        SET_BIT(ch->pcdata->powers[DPOWER_CURRENT],
                                DEM_UNFOLDED);
                        return;
                }
                else if (!str_cmp(arg, "fold") || !str_cmp(arg, "f"))
                {
                        if (!IS_DEMAFF(ch, DEM_UNFOLDED))
                        {
                                send_to_char
                                        ("But your wings are already folded!\n\r",
                                         ch);
                                return;
                        }
                        send_to_char
                                ("Your wings fold up behind your back.\n\r",
                                 ch);
                        act("$n's wings fold up behind $s back.", ch, NULL,
                            NULL, TO_ROOM);
                        REMOVE_BIT(ch->pcdata->powers[DPOWER_CURRENT],
                                   DEM_UNFOLDED);
                        return;
                }
                else
                {
                        send_to_char
                                ("Do you want to FOLD or UNFOLD your wings?\n\r",
                                 ch);
                        return;
                }
        }

        if (IS_DEMAFF(ch, DEM_WINGS))
        {
                if (IS_DEMAFF(ch, DEM_UNFOLDED))
                {
                        send_to_char
                                ("Your wings fold up behind your back.\n\r",
                                 ch);
                        act("$n's wings fold up behind $s back.", ch, NULL,
                            NULL, TO_ROOM);
                        REMOVE_BIT(ch->pcdata->powers[DPOWER_CURRENT],
                                   DEM_UNFOLDED);
                }
                send_to_char("Your wings slide into your back.\n\r", ch);
                act("$n's wings slide into $s back.", ch, NULL, NULL,
                    TO_ROOM);
                REMOVE_BIT(ch->pcdata->powers[DPOWER_CURRENT], DEM_WINGS);
                return;
        }
        send_to_char("Your wings extend from your back.\n\r", ch);
        act("A pair of wings extend from $n's back.", ch, NULL, NULL,
            TO_ROOM);
        SET_BIT(ch->pcdata->powers[DPOWER_CURRENT], DEM_WINGS);
        return;
}

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

        argument = one_argument(argument, arg);

        if (IS_NPC(ch))
                return;

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

        if (!IS_DEMPOWER(ch, DEM_LIFESPAN))
        {
                send_to_char
                        ("You haven't been granted the gift of lifespan.\n\r",
                         ch);
                return;
        }

        if ((obj = ch->pcdata->chobj) == NULL)
        {
                send_to_char("Huh?\n\r", ch);
                return;
        }

        if (obj->chobj == NULL || obj->chobj != ch)
        {
                send_to_char("Huh?\n\r", ch);
                return;
        }

        if (!IS_HEAD(ch, LOST_HEAD))
        {
                send_to_char
                        ("You cannot change your lifespan in this form.\n\r",
                         ch);
                return;
        }

        if (!str_cmp(arg, "l") || !str_cmp(arg, "long"))
                obj->timer = 0;
        else if (!str_cmp(arg, "s") || !str_cmp(arg, "short"))
                obj->timer = 1;
        else
        {
                send_to_char
                        ("Do you wish to have a long or short lifespan?\n\r",
                         ch);
                return;
        }
        send_to_char("Ok.\n\r", ch);

        return;
}

void do_weaponform(CHAR_DATA * ch, char *argument)
{
        OBJ_DATA *obj;

        if (IS_NPC(ch))
                return;
        if (!IS_CLASS(ch, CLASS_DEMON))
        {
                send_to_char("Huh?\n\r", ch);
                return;
        }
        else if (IS_AFFECTED(ch, AFF_POLYMORPH))
        {
                send_to_char("You cannot do this while polymorphed.\n\r", ch);
                return;
        }


        if (ch->pcdata->powers[DPOWER_OBJ_VNUM] < 1)
        {
                send_to_char
                        ("You don't have the ability to change into a weapon.\n\r",
                         ch);
                return;
        }
        if ((obj = create_object(get_obj_index(33120), 60)) == NULL)
        {
                send_to_char
                        ("You don't have the ability to change into a weapon.\n\r",
                         ch);
                return;
        }
        if (IS_AFFECTED(ch, AFF_WEBBED))
        {
                send_to_char("Not with all this sticky webbing on.\n\r", ch);
                return;
        }

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

        obj_to_room(obj, ch->in_room);
        act("$n transforms into $p and falls to the ground.", ch, obj, NULL,
            TO_ROOM);
        act("You transform into $p and fall to the ground.", ch, obj, NULL,
            TO_CHAR);
        ch->pcdata->obj_vnum = 33120;
        obj->chobj = ch;
        ch->pcdata->chobj = obj;
        SET_BIT(ch->affected_by, AFF_POLYMORPH);
        SET_BIT(ch->extra, EXTRA_OSWITCH);
        free_string(ch->morph);
        ch->morph = str_dup(obj->short_descr);
        return;
}

void do_humanform(CHAR_DATA * ch, char *argument)
{
        OBJ_DATA *obj;

        if (IS_NPC(ch))
                return;
        if ((obj = ch->pcdata->chobj) == NULL)
        {
                send_to_char("You are already in human form.\n\r", ch);
                return;
        }

        ch->pcdata->obj_vnum = 0;
        obj->chobj = NULL;
        ch->pcdata->chobj = NULL;
        REMOVE_BIT(ch->affected_by, AFF_POLYMORPH);
        REMOVE_BIT(ch->extra, EXTRA_OSWITCH);
        free_string(ch->morph);
        ch->morph = str_dup("");
        act("$p transforms into $n.", ch, obj, NULL, TO_ROOM);
        act("Your reform your human body.", ch, obj, NULL, TO_CHAR);
        extract_obj(obj);
        if (ch->in_room->vnum == ROOM_VNUM_IN_OBJECT)
        {
                char_from_room(ch);
                char_to_room(ch, get_room_index(ROOM_VNUM_HELL));
        }
        return;
}

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

        one_argument(argument, arg);

        if (IS_NPC(ch))
                return;
        if (!IS_CLASS(ch, CLASS_DEMON))
        {
                send_to_char("Huh?\n\r", ch);
                return;
        }
        xprintf(buf, "The champions of Hell:\n\r");
        send_to_char(buf, ch);
        send_to_char
                ("[      Name      ] [ Hits ] [ Mana ] [ Move ] [       Power ]\n\r",
                 ch);
        for (gch = char_list; gch != NULL; gch = gch->next)
        {
                if (IS_NPC(gch))
                        continue;
                if (!IS_CLASS(gch, CLASS_DEMON))
                        continue;
                xprintf(buf,
                        "[%-16s] [%-6d] [%-6d] [%-6d] [ %-9d%9d ]\n\r",
                        capitalize(gch->name),
                        gch->hit, gch->mana, gch->move,
                        gch->pcdata->stats[DEMON_CURRENT],
                        gch->pcdata->stats[DEMON_TOTAL]);
                send_to_char(buf, ch);
        }
        return;
}


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

        if (IS_NPC(ch))
                return;
        if (!IS_CLASS(ch, CLASS_DEMON))
        {
                send_to_char("huh.\n\r", ch);
                return;
        }
        if (IS_HEAD(ch, LOST_EYE_L) && IS_HEAD(ch, LOST_EYE_R))
        {
                send_to_char
                        ("But you don't have any more eyes to pluck out!\n\r",
                         ch);
                return;
        }
        if (!IS_HEAD(ch, LOST_EYE_L) && number_range(1, 2) == 1)
        {
                act("You pluck out your left eyeball and throw it to the ground.", ch, NULL, NULL, TO_CHAR);
                act("$n plucks out $s left eyeball and throws it to the ground.", ch, NULL, NULL, TO_ROOM);
        }
        else if (!IS_HEAD(ch, LOST_EYE_R))
        {
                act("You pluck out your right eyeball and throw it to the ground.", ch, NULL, NULL, TO_CHAR);
                act("$n plucks out $s right eyeball and throws it to the ground.", ch, NULL, NULL, TO_ROOM);
        }
        else
        {
                act("You pluck out your left eyeball and throw it to the ground.", ch, NULL, NULL, TO_CHAR);
                act("$n plucks out $s left eyeball and throws it to the ground.", ch, NULL, NULL, TO_ROOM);
        }
        if ((familiar = ch->pcdata->familiar) != NULL)
        {
                make_part(ch, "eyeball");
                return;
        }

        victim = create_mobile(get_mob_index(MOB_VNUM_EYE));
        SET_BIT(victim->act, ACT_NOEXP);
        if (victim == NULL)
        {
                send_to_char("Error - please inform KaVir.\n\r", ch);
                return;
        }

        char_to_room(victim, ch->in_room);

        ch->pcdata->familiar = victim;
        victim->wizard = ch;
        return;
}


void do_cone(CHAR_DATA * ch, char *argument)
{
        CHAR_DATA *victim;
        char      arg[MAX_INPUT_LENGTH];
        int       sn;
        int       level;
        int       spelltype;

        argument = one_argument(argument, arg);
        if (IS_NPC(ch))
                return;

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

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

        if ((victim = get_char_room(ch, NULL, arg)) == NULL)
                if ((victim = ch->fighting) == NULL)
                {
                        send_to_char("They aren't here.\n\r", ch);
                        return;
                }
        if (ch->mana < 100)
        {
                send_to_char("You don't have enough mana.\n\r", ch);
                return;
        }

        if ((sn = skill_lookup("cone")) < 0)
                return;
        spelltype = skill_table[sn].target;
        level = ch->spl[spelltype] * 1.0;
        level = level * 1.0;
        act("You Blast $N with a cone of fire.", ch, NULL, victim, TO_CHAR);
        act("$n Blasts you with a cone of fire.", ch, NULL, victim, TO_VICT);
        (*skill_table[sn].spell_fun) (sn, level, ch, victim);
        WAIT_STATE(ch, 10);
        ch->mana = ch->mana - 100;
        return;
}

void do_dstake(CHAR_DATA * ch, char *argument)
{
        OBJ_DATA *obj;

        if (IS_NPC(ch))
                return;

        if (!IS_CLASS(ch, CLASS_DEMON))
        {

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

        if (60 > ch->practice)
        {
                send_to_char
                        ("It costs 60 points of primal to create a stake.\n\r",
                         ch);
                return;
        }
        ch->practice -= 60;
        obj = create_object(get_obj_index(OBJ_VNUM_STAKE), 0);
        if (IS_SET(obj->quest, QUEST_ARTIFACT))
                REMOVE_BIT(obj->quest, QUEST_ARTIFACT);
        obj_to_char(obj, ch);
        act("A Stake appears in your hands in a flash of light.", ch, NULL,
            NULL, TO_CHAR);
        act("A Stake appears in $n's hands in a flash of light.", ch, NULL,
            NULL, TO_ROOM);
        return;
}