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_pkcall(CHAR_DATA * ch, char *argument)
{
        CHAR_DATA *gch;
        CHAR_DATA *victim;

        if (IS_NPC(ch))
                return;
        if (UMIN(ch->race, (ch->pkill - ch->pdeath)) < 30)
        {
                send_to_char("Huh?\n\r", ch);
                return;
        }
        if ((victim = ch->fighting) == NULL)
        {
                send_to_char("Your not engaged in combat.\n\r", ch);
                return;
        }
        do_say(ch, "TO ARMS!!! TO ARMS!!!!");
        if (IS_NPC(victim))
        {
                send_to_char("No effect.\n\r", ch);
                return;
        }
        for (gch = ch->in_room->people; gch != NULL; gch = gch->next_in_room)
        {
                if (!IS_NPC(gch))
                        continue;
                if (gch->master)
                        continue;   // not on charmies
                if (gch == ch->fighting)
                        continue;
                if (gch->fighting != NULL)
                        continue;
                if (gch->level > ch->race / 0.2 || gch->level > 2500)
                {
                        do_say(gch, "Fight your own fights you pansy.\n\r");
                        continue;
                }
                /*
                 * If the player was fighting a mob, it could actually be dead.
                 */
                if (ch->fighting == NULL)
                        return;
                if (number_range(1, 100) > 33)
                {
                        do_say(gch,
                               "To arms brothers, tonight we will feast in the halls of midgaard");
                        multi_hit(gch, ch->fighting, TYPE_UNDEFINED);
                }
        }
        WAIT_STATE(ch, 12);
        return;
}

void do_pkmind(CHAR_DATA * ch, char *argument)
{
        if (IS_NPC(ch))
                return;
        if (UMIN(ch->race, (ch->pkill - ch->pdeath)) < 40)
        {
                send_to_char("Huh?\n\r", ch);
                return;
        }
        if (IS_SET(ch->newbits, NEW_IRONMIND))
        {
                send_to_char("Your already focusing your mental powers.\n\r",
                             ch);
                return;
        }
        SET_BIT(ch->newbits, NEW_IRONMIND);
        send_to_char("You focus your concentration on absorbing damage.\n\r",
                     ch);
        WAIT_STATE(ch, 6);
        return;
}

/* Genstealing is in :-) */

void do_gensteal(CHAR_DATA * ch, char *argument)
{
        CHAR_DATA *victim;
        ROOM_INDEX_DATA *location;
        char      buf[MAX_STRING_LENGTH];
        char      arg[MAX_INPUT_LENGTH];

        one_argument(argument, arg);
        if (IS_NPC(ch))
                return;
        if (ch->in_room != NULL)
        {
                if (IS_SET(ch->in_room->room_flags, ROOM_ARENA))
                {
                        send_to_char("Your in the arena.\n\r", ch);
                        return;
                }
        }
        if (ragnarok)
        {
                send_to_char("Not while ragnarok is running.\n\r", ch);
                return;
        }
        if (arg[0] == '\0')
        {
                send_to_char("Gensteal 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 (ch == victim)
        {
                send_to_char("How stupid are you?!?\n\r", ch);
                return;
        }
        if (IS_NPC(victim))
        {
                send_to_char("Not on the mobs.\n\r", ch);
                return;
        }
        if (ch->class != victim->class)
        {
                send_to_char
                        ("Only on people of the same class as yourself.\n\r",
                         ch);
                return;
        }
        if (victim->position > 1)
        {
                send_to_char("He resists your attempt to gensteal.\n\r", ch);
                return;
        }
        if (ch->generation < victim->generation)
        {
                send_to_char
                        ("Sorry, you are already a higher generation than they are.\n\r",
                         ch);
                return;
        }
        if (victim->generation > 7)
        {
                send_to_char("They are worthless.\n\r", ch);
                return;
        }
        if (ch->generation == 1)
        {
                send_to_char("You are the highest possible generation.\n\r",
                             ch);
                return;
        }
        if (is_safe(ch, victim))
                return;
        if (in_fortress(ch) && arena2death)
        {
                arena2 = TRUE;
                if ((location = get_room_index(ROOM_VNUM_VICTORY)) == NULL)
                        return;
                char_from_room(victim);
                char_to_room(victim, location);
                char_from_room(ch);
                char_to_room(ch, location);
                update_bets(ch, victim, FALSE);
        }
        else if (in_fortress(ch))
        {
                send_to_char("Your in The Forbidden Fortress.\n\r", ch);
                return;
        }
        act("Lightning flows through your body as you steal the powers of $N.\n\r", ch, NULL, victim, TO_CHAR);
        act("$n puts his hands on $N's head and lightning covers his body.\n\r", ch, NULL, victim, TO_NOTVICT);
        send_to_char("Your generation has been stolen.\n\r", victim);
        xprintf(buf,
                "#G%s #yhas beaten #B%s #yin combat, and has stolen their generation!#n",
                ch->pcdata->switchname, victim->pcdata->switchname);
	ch->combat = NULL;
        do_info(ch, buf);
        ch->generation -= 1;
        victim->generation += 1;
        if (victim->genexp > 1)
                victim->genexp /= 2;
        ch->genexp = 0;
        ch->fight_timer += 5;
        victim->hit = 1;
        update_pos(victim);
        WAIT_STATE(ch, 12);
        if ((location = get_room_index(ROOM_VNUM_ALTAR)) == NULL)
                return;
        char_from_room(victim);
        char_to_room(victim, location);
        victim->fight_timer = 0;
        players_gstolen++;
        xprintf(buf, "%s was genstolen by %s", victim->name, ch->name);
        log_string(LOG_COMMAND, buf);
        return;
}

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

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

        if (ch->fighting == NULL)
        {
                send_to_char("Ah, but your not really fighting anyone!\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)
        {
                send_to_char("How stupid are you?!?\n\r", ch);
                return;
        }
        if (ch->fighting == victim)
        {
                send_to_char
                        ("Maybe you should just continue fighting them.\n\r",
                         ch);
                return;
        }
        if (victim->fighting == NULL || victim->fighting != ch)
        {
                send_to_char("You failed.\n\r", ch);
                return;
        }
        if (number_range(1, 3) == 1)
        {
                send_to_char("You failed.\n\r", ch);
                WAIT_STATE(ch, 12);
                return;
        }
        ch->fighting = victim;
        send_to_char("Hehe, bet they didn't expect that to happen...\n\r",
                     ch);
        WAIT_STATE(ch, 6);
        return;
}

void do_artisteal(CHAR_DATA * ch, char *argument)
{
        char      arg[MAX_INPUT_LENGTH];
        char      buf[MSL];
        CHAR_DATA *victim;
        OBJ_DATA *obj;
        int       i;

        if (IS_NPC(ch))
                return;

        one_argument(argument, arg);
        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("That's a mobile.\n\r", ch);
                return;
        }
        if (victim->position != POS_MORTAL)
        {
                send_to_char("They need to be mortally wounded.", ch);
                return;
        }
        if (!IS_SET(victim->pcdata->tempflag, TEMP_ARTIFACT))
        {
                send_to_char("They do not have an artifact.\n\r", ch);
                return;
        }
        for (i = 0; i < MAX_WEAR; i++)
        {
                if ((obj = get_eq_char(victim, i)) != NULL)
                {
                        if (IS_SET(obj->quest, QUEST_ARTIFACT))
                        {
                                obj_from_char(obj);
                                obj_to_char(obj, ch);
                                send_to_char
                                        ("You steal the artifact from them.\n\r",
                                         ch);
                                act("$n steals $p from $N.", ch, obj, victim,
                                    TO_ROOM);
                                xprintf(buf, "%s has stolen %s from %s!!\n\r",
                                        ch->pcdata->switchname,
                                        obj->short_descr,
                                        victim->pcdata->switchname);
                                do_info(ch, buf);
                                return;
                        }
                }
        }
        for (obj = victim->carrying; obj; obj = obj->next_content)
        {
                if (IS_SET(obj->quest, QUEST_ARTIFACT))
                {
                        obj_from_char(obj);
                        obj_to_char(obj, ch);
                        send_to_char("You steal the artifact from them.\n\r",
                                     ch);
                        act("$n steals $p from $N.", ch, obj, victim,
                            TO_ROOM);
                        return;
                }
        }
        send_to_char("Malfunction - please report this.\n\r", ch);
        return;
}

void ragnarokdecap(CHAR_DATA * ch, CHAR_DATA * victim)
{
        char      buf[MAX_STRING_LENGTH];

        char_from_room(victim);
        char_to_room(victim, get_room_index(ROOM_VNUM_ALTAR));
        do_clearstats(victim, "");
        REMOVE_BIT(victim->extra, TIED_UP);
        REMOVE_BIT(victim->extra, GAGGED);
        REMOVE_BIT(victim->extra, BLINDFOLDED);
        victim->level = 2;
        dropinvis(ch);
        players_decap++;
        xprintf(buf, "%s was beheaded by %s, the ragnarok continues",
                victim->name, ch->name);
        do_info(ch, buf);
        send_to_char("YOU HAVE BEEN KILLED!!!!\n\r", victim);
        do_call(victim, "all");
        do_train(victim, "avatar");
        do_restore(victim, "self");
        return;
}

void fortresskill(CHAR_DATA * ch, CHAR_DATA * victim)
{
        char      buf[MAX_STRING_LENGTH];
        ROOM_INDEX_DATA *location;

        if (IS_NPC(ch) || IS_NPC(victim))
        {
                bug("Fortress failure", 0);
                return;
        }

        /*
         * cleanup
         */
        ch->fight_timer = 0;
        victim->fight_timer = 0;
        free_string(victim->morph);
        victim->morph = str_dup("");
        do_restore(ch, ch->name);
        do_restore(ch, victim->name);
        REMOVE_BIT(victim->extra, TIED_UP);
        REMOVE_BIT(victim->extra, GAGGED);
        REMOVE_BIT(victim->extra, BLINDFOLDED);

        /*
         * Tally the score
         */
        ch->pcdata->awins++;
        victim->pcdata->alosses++;

        /*
         * Information
         */
        xprintf(buf, "%s was beaten in The Forbidden Fortress by %s.",
                victim->name, ch->name);
        do_info(ch, buf);

        /*
         * Out they go.
         */
        if ((location = get_room_index(ROOM_VNUM_ALTAR)) == NULL)
                return;
        char_from_room(victim);
        char_to_room(victim, location);
        char_from_room(ch);
        char_to_room(ch, location);

        do_call(ch, "all");
        do_call(victim, "all");
        do_clearstats(victim, "");
        victim->level = 2;

        /*
         * Open the Fortress
         */
        arena2 = TRUE;
        return;
}