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.                                               *
 *                                                                         *
 *  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.                                                    *
 ***************************************************************************/
/* Cyborg Class by Zaphonite 
   Modified by Vladd
   Modified by Jobo for use as Spider Droids
 */
#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 "interp.h"

void do_implant(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_CYBORG))
        {
                send_to_char("Huh?\n\r", ch);
                return;
        }

        if (arg1[0] == '\0' && arg2[0] == '\0')
        {
                xprintf(buf,
                        "#BCurrent implant levels#R: #wFace: #R%d#w, Legs: #R%d#w, Body: #R%d#w.#n\n\r\n\r",
                        UMIN(ch->pcdata->powers[CYBORG_FACE], 5),
                        UMIN(ch->pcdata->powers[CYBORG_LIMBS], 5),
                        UMIN(ch->pcdata->powers[CYBORG_BODY], 6));
                send_to_char(buf, ch);
                do_implant(ch, "face");
                do_implant(ch, "legs");
                do_implant(ch, "body");
                send_to_char
                        ("\n\r#BSyntax: #wimplant #0(#wplace#D) #wimprove.#n\n\r",
                         ch);
                return;
        }
        if (arg2[0] == '\0')
        {
                if (!str_cmp(arg1, "face"))
                {
                        send_to_char("#0Current Facial Implants:#n\n\r", ch);
                        if (ch->pcdata->powers[CYBORG_FACE] < 1)
                                send_to_char("None.\n\r", ch);
                        if (ch->pcdata->powers[CYBORG_FACE] > 0)
                        {
                                if (ch->pcdata->powers[CYBORG_FACE] > 3)
                                {
                                        send_to_char
                                                ("Your have bio-mechanical eyes blessed by Lloth.\n\r",
                                                 ch);
                                        send_to_char
                                                ("Your aura is shielded.\n\r",
                                                 ch);
                                        send_to_char
                                                ("Your senses are improved, allowing you to see the stats and location of others.\n\r",
                                                 ch);
                                        return;
                                }
                                else if ((ch->pcdata->powers[CYBORG_FACE] ==
                                          2))
                                        send_to_char
                                                ("You can see in the night and shadows.\n\r",
                                                 ch);
                                else if ((ch->pcdata->powers[CYBORG_FACE] ==
                                          1))
                                        send_to_char
                                                ("You can see in the night.\n\r",
                                                 ch);
                        }
                        return;
                }
                else if (!str_cmp(arg1, "legs"))
                {
                        send_to_char("#0Current Leg Implants:#n\n\r", ch);
                        if (ch->pcdata->powers[CYBORG_LIMBS] < 1)
                                send_to_char("#wNone#n.\n\r", ch);
                        if (ch->pcdata->powers[CYBORG_LIMBS] > 0)
                                send_to_char
                                        ("#wYour human legs have been replaced with stronger mechanical ones.#n\n\r",
                                         ch);
                        if (ch->pcdata->powers[CYBORG_LIMBS] > 1)
                                send_to_char
                                        ("#wDoctors have blessed you with superior speed.#n\n\r",
                                         ch);
                        if (ch->pcdata->powers[CYBORG_LIMBS] > 2)
                                send_to_char
                                        ("#wYour are one of futures champions.#n\n\r",
                                         ch);
                        if (ch->pcdata->powers[CYBORG_LIMBS] > 3)
                                send_to_char
                                        ("#wYou are a true cyborg warrior, you have supreme fighting skills.#n\n\r",
                                         ch);
                        if (ch->pcdata->powers[CYBORG_LIMBS] > 4)
                                send_to_char
                                        ("#wYour spit is now pure corrosive poison.#n\n\r",
                                         ch);
                        return;
                }
                else if (!str_cmp(arg1, "body"))
                {
                        send_to_char("#0Current Body Implants:#n\n\r", ch);
                        if (ch->pcdata->powers[CYBORG_BODY] < 1)
                                send_to_char("None.\n\r", ch);
                        if (ch->pcdata->powers[CYBORG_BODY] > 0)
                                send_to_char
                                        ("Your body's armor has been increased greatly.\n\r",
                                         ch);
                        if (ch->pcdata->powers[CYBORG_BODY] > 1)
                                send_to_char
                                        ("Your body can absorb certain attacks.\n\r",
                                         ch);
                        if (ch->pcdata->powers[CYBORG_BODY] > 2)
                                send_to_char
                                        ("You body slam your enemy when you have first attack.\n\r",
                                         ch);
                        if (ch->pcdata->powers[CYBORG_BODY] > 3)
                                send_to_char
                                        ("You have the power to cloak yourself and become invisible.\n\r",
                                         ch);
                        if (ch->pcdata->powers[CYBORG_BODY] > 4)
                                send_to_char
                                        ("You have poisoned stingers that shoot at your enemies from your body.\n\r",
                                         ch);
                        if (ch->pcdata->powers[CYBORG_BODY] > 5)
                                send_to_char("You regenerate very fast.\n\r",
                                             ch);
                        return;
                }
                xprintf(buf,
                        "#BCurrent implant levels#w: #wFace: #R%d#w, Legs: #R%d#w, Body: #R%d#w.#x\n\r\n\r",
                        UMIN(ch->pcdata->powers[CYBORG_FACE], 5),
                        UMIN(ch->pcdata->powers[CYBORG_LIMBS], 5),
                        UMIN(ch->pcdata->powers[CYBORG_BODY], 6));
                send_to_char(buf, ch);
                return;
        }
        if (!str_cmp(arg2, "improve"))
        {
                int       implant;
                int       cost;
                int       max;

                if (!str_cmp(arg1, "face"))
                {
                        implant = CYBORG_FACE;
                        max = 5;
                }
                else if (!str_cmp(arg1, "legs"))
                {
                        implant = CYBORG_LIMBS;
                        max = 5;
                }
                else if (!str_cmp(arg1, "body"))
                {
                        implant = CYBORG_BODY;
                        max = 6;
                }
                else
                {
                        send_to_char("Implants are face, legs, and body.\n\r",
                                     ch);
                        return;
                }
                if ((ch->pcdata->powers[implant] == 1))
                        cost = 25000;
                else if ((ch->pcdata->powers[implant] == 2))
                        cost = 50000;
                else if ((ch->pcdata->powers[implant] == 3))
                        cost = 100000;
                else if ((ch->pcdata->powers[implant] == 4))
                        cost = 200000;
                else if ((ch->pcdata->powers[implant] == 5))
                        cost = 400000;
                else if ((ch->pcdata->powers[implant] == 6))
                        cost = 800000;
                else
                        cost = 12500;
                arg1[0] = UPPER(arg1[0]);
                if ((ch->pcdata->powers[implant] >= max))
                {
                        xprintf(buf,
                                "You already have all implants on your %s.\n\r",
                                arg1);
                        send_to_char(buf, ch);
                        return;
                }
                if (!str_cmp(arg1, "face"))
                {
                        if ((ch->pcdata->powers[CYBORG_FACE] == 4 &&
                             ch->pcdata->powers[CYBORG_BODY] < 4))
                        {
                                send_to_char
                                        ("You need the 4th body implant first.\n\r",
                                         ch);
                                return;
                        }
                }

                if (!str_cmp(arg1, "body"))
                {
                        if (ch->pcdata->powers[CYBORG_LIMBS] < 1)
                        {
                                send_to_char
                                        ("You need at least 1 leg implant before you can get any body implants.\n\r",
                                         ch);
                                return;
                        }
                }

                if (cost > ch->pcdata->stats[CYBORG_POWER])
                {
                        xprintf(buf,
                                "Your bionic power must be greater than %d before you can improve your %s implants.\n\r",
                                cost, arg1);
                        send_to_char(buf, ch);
                        return;
                }

                ch->pcdata->powers[implant] += 1;
                ch->pcdata->stats[CYBORG_POWER] -= cost;
                xprintf(buf, "You add an implant to your %s.\n\r", arg1);
                send_to_char(buf, ch);
                return;
        }
        else
                send_to_char("Syntax: implant (place) improve.\n\r", ch);
        return;
}

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

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

        if (ch->pcdata->powers[CYBORG_BODY] < 5
            || ch->pcdata->powers[CYBORG_LIMBS] < 5)
        {
                send_to_char
                        ("You need level 5 implants on your legs and body to use this.\n\r",
                         ch);
                return;
        }

        if (ch->move < 1000)
        {
                stc("You need 1000 move to do that.\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);
        ch->move -= 1000;

        one_hit(ch, victim, gsn_stuntubes, 1);
        one_hit(ch, victim, gsn_stuntubes, 1);
        one_hit(ch, victim, gsn_stuntubes, 1);
        one_hit(ch, victim, gsn_stuntubes, 1);
        if (!IS_AFFECTED(victim, AFF_POISON))
                SET_BIT(victim->affected_by, AFF_POISON);
        if (!IS_AFFECTED(victim, AFF_FLAMING))
                SET_BIT(victim->affected_by, AFF_FLAMING);
        return;
}

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

        if (IS_NPC(ch))
                return;

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

        if (ch->pcdata->powers[CYBORG_BODY] < 5)
        {
                send_to_char("You must have level 5 body.\n\r", ch);
                return;
        }

        if (IS_SET(ch->newbits, NEW_CUBEFORM))
        {
                REMOVE_BIT(ch->newbits, NEW_CUBEFORM);
                REMOVE_BIT(ch->affected_by, AFF_POLYMORPH);
                act("$n returns to a normal man.", ch, NULL, NULL, TO_ROOM);
                send_to_char("You turn into your normal form.\n\r", ch);
                ch->damroll -= 250;
                ch->hitroll -= 250;
                free_string(ch->morph);
                ch->morph = str_dup("");
                return;
        }

        if (ch->move < 2000 || ch->mana < 2000)
        {
                send_to_char
                        ("You need 2000 mana and 2000 move to make yourself an avatar of Lloth.\n\r",
                         ch);
                return;
        }

        else
        {
                act("$n eyes glow with red light as a bloodlust fills them.",
                    ch, NULL, NULL, TO_ROOM);
                send_to_char("You become a true TERMINATOR!.\n\r", ch);
                SET_BIT(ch->newbits, NEW_CUBEFORM);
                SET_BIT(ch->affected_by, AFF_POLYMORPH);
                xprintf(buf, "%s the Terminator", ch->name);
                free_string(ch->morph);
                ch->morph = str_dup(buf);
                ch->move -= 2000;
                ch->mana -= 2000;
                ch->damroll += 250;
                ch->hitroll += 250;
                return;
        }
        return;
}


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

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

        if (ch->pcdata->powers[CYBORG_FACE] < 1)
        {
                send_to_char
                        ("You need at least 1 implant on your face to use your unholy sight.\n\r",
                         ch);
                return;
        }
        if (ch->pcdata->powers[CYBORG_FACE] > 2)
        {
                if (IS_SET(ch->act, PLR_HOLYLIGHT))
                {
                        REMOVE_BIT(ch->act, PLR_HOLYLIGHT);
                        send_to_char("You turn off your unholy sight.\n\r",
                                     ch);
                }
                else
                {
                        SET_BIT(ch->act, PLR_HOLYLIGHT);
                        send_to_char("You turn on your unholy sight.\n\r",
                                     ch);
                }
        }
        else if (ch->pcdata->powers[CYBORG_FACE] == 2)
        {
                if (IS_SET(ch->affected_by, AFF_SHADOWSIGHT)
                    && IS_SET(ch->pcdata->stats[UNI_AFF], VAM_NIGHTSIGHT))
                {
                        REMOVE_BIT(ch->affected_by, AFF_SHADOWSIGHT);
                        REMOVE_BIT(ch->pcdata->stats[UNI_AFF],
                                   VAM_NIGHTSIGHT);
                        send_to_char("You turn off your unholy sight.\n\r",
                                     ch);
                }
                else
                {
                        SET_BIT(ch->affected_by, AFF_SHADOWSIGHT);
                        SET_BIT(ch->pcdata->stats[UNI_AFF], VAM_NIGHTSIGHT);
                        send_to_char("You turn on your unholy sight.\n\r",
                                     ch);
                }
        }
        else if ((ch->pcdata->powers[CYBORG_FACE] == 1))
        {
                if (IS_SET(ch->pcdata->stats[UNI_AFF], VAM_NIGHTSIGHT))
                {
                        REMOVE_BIT(ch->pcdata->stats[UNI_AFF],
                                   VAM_NIGHTSIGHT);
                        send_to_char("You turn off your unholy sight.\n\r",
                                     ch);
                }
                else
                {
                        SET_BIT(ch->pcdata->stats[UNI_AFF], VAM_NIGHTSIGHT);
                        send_to_char("You turn on your unholy sight.\n\r",
                                     ch);
                }
        }
        return;
}

void do_cyborgeq(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_CYBORG))
        {
                send_to_char("Huh?\n\r", ch);
                return;
        }

        if (arg[0] == '\0')
        {
                send_to_char
                        ("Please specify which piece of cyborg armor you wish to make: whip ring "
                         "collar armor helmet leggings boots gloves sleeves cloak belt bracer mask.\n\r",
                         ch);
                return;
        }

        if (!str_cmp(arg, "whip"))
                vnum = 33140;
        else if (!str_cmp(arg, "ring"))
                vnum = 33141;
        else if (!str_cmp(arg, "collar"))
                vnum = 33142;
        else if (!str_cmp(arg, "armor"))
                vnum = 33143;
        else if (!str_cmp(arg, "helmet"))
                vnum = 33144;
        else if (!str_cmp(arg, "leggings"))
                vnum = 33145;
        else if (!str_cmp(arg, "boots"))
                vnum = 33146;
        else if (!str_cmp(arg, "gloves"))
                vnum = 33147;
        else if (!str_cmp(arg, "sleeves"))
                vnum = 33148;
        else if (!str_cmp(arg, "cloak"))
                vnum = 33149;
        else if (!str_cmp(arg, "belt"))
                vnum = 33150;
        else if (!str_cmp(arg, "bracer"))
                vnum = 33151;
        else if (!str_cmp(arg, "mask"))
                vnum = 33152;
        else
        {
                do_cyborgeq(ch, "");
                return;
        }
        if (ch->practice < 100)
        {
                send_to_char
                        ("It costs 100 primal to create a piece of cyborg armour.\n\r",
                         ch);
                return;
        }
        if (vnum == 0 || (pObjIndex = get_obj_index(vnum)) == NULL)
        {
                send_to_char("Missing object, please inform Dracknuur.\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;
}