cotn/notes/
cotn/src/
/*  (O)xx}========> Thief Class  <========{xx(O)
                      By Trent
				    Seeds of Hate
			  Swords & Sorcery Edition
		====================================
*/

/***************************************************************************
 *                                 _/                            _/        *
 *      _/_/_/  _/_/      _/_/_/  _/    _/_/    _/    _/    _/_/_/         *
 *     _/    _/    _/  _/        _/  _/    _/  _/    _/  _/    _/          *
 *    _/    _/    _/  _/        _/  _/    _/  _/    _/  _/    _/           *
 *   _/    _/    _/    _/_/_/  _/    _/_/      _/_/_/    _/_/_/            *
 ***************************************************************************
 * Mindcloud Copyright 2001-2003 by Jeff Boschee (Zarius),                 *
 * Additional credits are in the help file CODECREDITS                     *
 * All Rights Reserved.                                                    *
 ***************************************************************************/

#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_thiefskills(CHAR_DATA * ch, char *argument)
{

        if (IS_NPC(ch))
                return;

        if (!IS_CLASS(ch, CLASS_THIEF))
        {
                send_to_char("#cHuh?\n\r", ch);
                return;
        }

        send_to_char("#rT#Rh#0ief Skil#Rl#rs#n\n\n\r", ch);

        if (IS_SET(ch->pcdata->powers[1], THIEF_CONCEAL))
                send_to_char("#0Hide in Shadows (Conceal)#n\n\r", ch);

        if (IS_SET(ch->pcdata->powers[1], THIEF_GLEAM))
                send_to_char("#0Gleam of Nighteyes#n\n\r", ch);

        if (IS_SET(ch->pcdata->powers[1], THIEF_SWIFTNESS))
                send_to_char("#0Swiftness (auto)#n\n\r", ch);

        if (IS_SET(ch->pcdata->powers[1], THIEF_CRITICALSTRIKE))
                send_to_char("#0Critical Strike (auto)#n\n\r", ch);

        if (IS_SET(ch->pcdata->powers[1], THIEF_BACKSTAB))
                send_to_char("#0Backstab (bstab)#n\n\r", ch);

        if (IS_SET(ch->pcdata->powers[1], THIEF_POISONBLADE))
                send_to_char("#0Poison Blade#n\n\r", ch);

        if (IS_SET(ch->pcdata->powers[1], THIEF_TDAGGER))
                send_to_char("#0Throwing Dagger (tdagger)#n\n\r", ch);

        if (IS_SET(ch->pcdata->powers[1], THIEF_TOUGHSKIN))
                send_to_char("#0Toughskin (auto)#n\n\r", ch);

        if (IS_SET(ch->pcdata->powers[1], THIEF_MIGHT))
                send_to_char("#0Might of the Panther(auto)#n\n\r", ch);

        if (IS_SET(ch->pcdata->powers[1], THIEF_DTRICK))
                send_to_char("#0Dirty Trick (dtrick)#n\n\r", ch);

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


void do_rolldice(CHAR_DATA * ch, char *argument)
{
        int       roll;

        if (IS_NPC(ch))
                return;

        if (!IS_CLASS(ch, CLASS_THIEF))
        {
                send_to_char("#cHuh?\n\r", ch);
                return;
        }

        if (ch->practice < 100)
        {
                send_to_char
                        ("#cIt costs 100 primal to roll the magikal dice!\n\r",
                         ch);
                return;
        }

        ch->practice -= 100;
        send_to_char("#CYou roll the dice of fate...#n\n\r", ch);

        roll = number_range(1, 10);

        if ((roll == 1))
        {
                send_to_char
                        ("#CThe die spins on its side, then comes up 1!\n\r",
                         ch);
                if (IS_SET(ch->pcdata->powers[1], THIEF_GLEAM))
                {
                        send_to_char
                                ("#CYou already have that power! Roll again.#n\n\r",
                                 ch);
                        ch->practice += 100;
                        return;
                }

                SET_BIT(ch->pcdata->powers[1], THIEF_GLEAM);
                send_to_char("#cYou gain #0Gleam of Night Eyes#c!#n\n\r", ch);
                return;
        }

        else if ((roll == 2))
        {
                send_to_char
                        ("#CThe die spins on its side, then comes up 2!\n\r",
                         ch);

                if (IS_SET(ch->pcdata->powers[1], THIEF_CONCEAL))
                {
                        send_to_char
                                ("#CYou already have that power! Roll again.#n\n\r",
                                 ch);
                        ch->practice += 100;
                        return;
                }

                SET_BIT(ch->pcdata->powers[1], THIEF_CONCEAL);
                send_to_char("#cYou gain #0Hide in Shadows#c!#n\n\r", ch);
                return;
        }

        else if ((roll == 3))
        {
                send_to_char
                        ("#CThe die spins on its side, then comes up 3!\n\r",
                         ch);

                if (IS_SET(ch->pcdata->powers[1], THIEF_SWIFTNESS))
                {
                        send_to_char
                                ("#CYou already have that power! Roll again.#n\n\r",
                                 ch);
                        ch->practice += 100;
                        return;
                }

                SET_BIT(ch->pcdata->powers[1], THIEF_SWIFTNESS);
                send_to_char("#cYou gain #0Swiftness#c!#n\n\r", ch);
                return;
        }

        else if ((roll == 4))
        {
                send_to_char
                        ("#CThe die spins on its side, then comes up 4!\n\r",
                         ch);

                if (IS_SET(ch->pcdata->powers[1], THIEF_CRITICALSTRIKE))
                {
                        send_to_char
                                ("#CYou already have that power! Roll again.#n\n\r",
                                 ch);
                        ch->practice += 100;
                        return;
                }

                SET_BIT(ch->pcdata->powers[1], THIEF_CRITICALSTRIKE);
                send_to_char
                        ("#cYou gain the #0Critical Strike#c skill!#n\n\r",
                         ch);
                return;
        }

        else if ((roll == 5))
        {
                send_to_char
                        ("#CThe die spins on its side, then comes up 5!\n\r",
                         ch);

                if (IS_SET(ch->pcdata->powers[1], THIEF_BACKSTAB))
                {
                        send_to_char
                                ("#CYou already have that power! Roll again.#n\n\r",
                                 ch);
                        ch->practice += 100;
                        return;
                }

                SET_BIT(ch->pcdata->powers[1], THIEF_BACKSTAB);
                send_to_char("#cYou gain the #0Backstab#c skill!#n\n\r", ch);
                return;
        }

        else if ((roll == 6))
        {
                send_to_char
                        ("#CThe die spins on its side, then comes up 6!\n\r",
                         ch);

                if (IS_SET(ch->pcdata->powers[1], THIEF_POISONBLADE))
                {
                        send_to_char
                                ("#CYou already have that power! Roll again.#n\n\r",
                                 ch);
                        ch->practice += 100;
                        return;
                }

                SET_BIT(ch->pcdata->powers[1], THIEF_POISONBLADE);
                send_to_char("#cYou gain the #0PoisonBlade#c skill!#n\n\r",
                             ch);
                return;
        }

        else if ((roll == 7))
        {
                send_to_char
                        ("#CThe die spins on its side, then comes up 7!\n\r",
                         ch);

                if (IS_SET(ch->pcdata->powers[1], THIEF_TDAGGER))
                {
                        send_to_char
                                ("#CYou already have that power! Roll again.#n\n\r",
                                 ch);
                        ch->practice += 100;
                        return;
                }

                SET_BIT(ch->pcdata->powers[1], THIEF_TDAGGER);
                send_to_char
                        ("#cYou learn the art of #0Throwing Daggers#c!#n\n\r",
                         ch);
                return;
        }

        else if ((roll == 8))
        {
                send_to_char
                        ("#CThe die spins on its side, then comes up 8!\n\r",
                         ch);

                if (IS_SET(ch->pcdata->powers[1], THIEF_TOUGHSKIN))
                {
                        send_to_char
                                ("#CYou already have that power! Roll again.#n\n\r",
                                 ch);
                        ch->practice += 100;
                        return;
                }

                SET_BIT(ch->pcdata->powers[1], THIEF_TOUGHSKIN);
                send_to_char
                        ("#cYou train to withstand more pain and gain the #0Toughskin#c discipline!#n\n\r",
                         ch);
                return;
        }

        else if ((roll == 9))
        {
                send_to_char
                        ("#CThe die spins on its side, then comes up 9!\n\r",
                         ch);

                if (IS_SET(ch->pcdata->powers[1], THIEF_MIGHT))
                {
                        send_to_char
                                ("#CYou already have that power! Roll again.#n\n\r",
                                 ch);
                        ch->practice += 100;
                        return;
                }

                SET_BIT(ch->pcdata->powers[1], THIEF_MIGHT);
                send_to_char("#cYou gain the #0Might of the Panther#c!#n\n\r",
                             ch);
                return;
        }

        else if ((roll == 10))
        {
                send_to_char
                        ("#CThe die spins on its side, then comes up 10!\n\r",
                         ch);

                if (IS_SET(ch->pcdata->powers[1], THIEF_DTRICK))
                {
                        send_to_char
                                ("#CYou already have that power! Roll again.#n\n\r",
                                 ch);
                        ch->practice += 100;
                        return;
                }

                SET_BIT(ch->pcdata->powers[1], THIEF_DTRICK);
                send_to_char("#cYou learn some #0Dirty Tricks#c!#n\n\r", ch);
                return;
        }

        return;
}

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

        if (IS_NPC(ch))
                return;

        if (!IS_CLASS(ch, CLASS_THIEF))
        {
                send_to_char("#cHuh?\n\r", ch);
                return;
        }

        if (!IS_SET(ch->pcdata->powers[1], THIEF_CONCEAL))
        {
                stc("#RYou must have the #0Hide in Shadows#R skill to do this!#n\n\r", ch);
                return;
        }

        if (ch->fight_timer > 0)
        {
                stc("#RNot with a fight timer!#n\n\r", ch);
                return;
        }

        if (ch->move < 2500)
        {
                stc("#RYou do not have the necessary 2500 move!\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_SET(ch->act, PLR_WIZINVIS))
        {
                REMOVE_BIT(ch->act, PLR_WIZINVIS);
                act("#R$n #0steps out of the shadows.#n", ch, NULL, NULL, TO_ROOM);
                send_to_char("#0You step out of the shadows.#n\n\r", ch);
                return;
        }
        else
        {
                act("#R$n #0dissapears into the shadows, dagger in hand.#n", ch, NULL, NULL, TO_ROOM);
                send_to_char("#0You dissapear into the shadows, dagger in hand.#n\n\r", ch);
                SET_BIT(ch->act, PLR_WIZINVIS);
        }
        ch->move -= 2500;
        return;
}

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

        if (!IS_CLASS(ch, CLASS_THIEF)
            || !IS_SET(ch->pcdata->powers[1], THIEF_GLEAM))
        {
                stc("Huh?\n\r", ch);
                return;
        }

        if (IS_SET(ch->act, PLR_HOLYLIGHT))
        {
                REMOVE_BIT(ch->act, PLR_HOLYLIGHT);
                send_to_char("#0Your eyes stop gleaming.#n\n\r", ch);
        }
        else
        {
                SET_BIT(ch->act, PLR_HOLYLIGHT);
                send_to_char("#0Your eyes begin to gleam in the night.#n\n\r",
                             ch);
        }
        return;
}

void do_bstab(CHAR_DATA * ch, char *argument)
{
        CHAR_DATA *victim;
        OBJ_DATA *obj;
        char      arg1[MAX_INPUT_LENGTH];
        char      buf[MAX_STRING_LENGTH];
        int       dam;
        int       assassinationchance;
        int       randomizer;

        argument = one_argument(argument, arg1);

        if (IS_NPC(ch))
                return;

        if (!IS_CLASS(ch, CLASS_THIEF)
            || !IS_SET(ch->pcdata->powers[1], THIEF_BACKSTAB))
        {
                stc("Huh?\n\r", ch);
                return;
        }

        if (arg1[0] == '\0')
        {
                send_to_char("#0Backstab whom?#n\n\r", ch);
                return;
        }

        if ((victim = get_char_room(ch, NULL, arg1)) == NULL)
        {
                send_to_char("#0They aren't here.#n\n\r", ch);
                return;
        }

        if ((victim == ch))
        {
                stc("#RLike to see you pull THAT one off...#n\n\r", ch);
                return;
        }

        if (((obj = get_eq_char(ch, WEAR_WIELD)) == NULL
             || obj->value[3] != 11)
            && ((obj = get_eq_char(ch, WEAR_HOLD)) == NULL
                || obj->value[3] != 11))
        {
                send_to_char("You need to wield a piercing weapon.\n\r", ch);
                return;
        }
        if (victim->fighting != NULL)
        {
                send_to_char("You can't backstab a fighting person.\n\r", ch);
                return;
        }

        if (!IS_SET(ch->act, PLR_WIZINVIS))
        {
                stc("#0You must be concealed in the shadows to preform this technique!#n\n\r", ch);
                return;
        }


        if (ch->move < 10000)
        {
                stc("#0You do not have the required #R10000 #rm#Rove#n.\n\r",
                    ch);
                return;
        }
        randomizer = (10000 / (ch->max_hit / ch->hit));
        assassinationchance = number_range(1, 10);
        dam = number_range(victim->max_hit * .1, victim->max_hit * .25);
        if (!IS_NPC(victim) && dam > 7000)
                dam = (number_fuzzy(number_range(1, 5) * 5) + 7000);
        //assassination for little mobs
        if (IS_NPC(victim) && victim->hit < (ch->max_move / 2)
            && assassinationchance >= 8)
        {
                REMOVE_BIT(ch->act, PLR_WIZINVIS);
                act("#R$n #0steps out of the shadows, and in one quick move, #Rslices #r$N's #Rhead #0from $S shoulders!#n\n\r", ch, NULL, victim, TO_NOTVICT);
                act("#0You leap from the shadows, and without breaking a sweat, #Rsever #r$N's #Rhead #0from $S shoulders!  #r<<#RAssassination!#r>>#n", ch, NULL, victim, TO_CHAR);
                ch->move -= randomizer;
                make_part(victim, "head");
                ch->exp += 10000 * victim->level;
                raw_kill(victim, ch);
                xprintf(buf,
                        "#r%s #0wipes the #Rblood #0from his #7dagger #0after making another skillfull #Rassa#rssina#Rtion#n.",
                        ch->pcdata->switchname);
                do_info(ch, buf);
                return;
        }

        REMOVE_BIT(ch->act, PLR_WIZINVIS);
        act("#R$n#0 steps out from the shadows behind #r$N #0and drives a #7dagger #0into $s back!#n\n\r", ch, NULL, victim, TO_NOTVICT);
        xprintf(buf,
                "#0You step out of the shadows behind #R$N #0and drive a #7dagger #0into $S back!#n   #r[#R%d#r]#n\n\r#n",
                dam);
        act(buf, ch, NULL, victim, TO_CHAR);
        xprintf(buf,
                "#0You scream in #Ragony #0as you feel a sharp #7dagger #0plunge into your back!   #r[#R%d#r]#n\n\r",
                dam);
        stc(buf, victim);
        ch->move -= 10000;
        hurt_person(ch, victim, dam);
        if (victim->hit < -10)
                victim->hit = -10;
        WAIT_STATE(ch, 2 * PULSE_VIOLENCE);
        multi_hit(ch, victim, TYPE_UNDEFINED);
        return;
}

void do_tdagger(CHAR_DATA * ch, char *argument)
{
        CHAR_DATA *victim;
        OBJ_DATA *obj;
        char      arg1[MAX_INPUT_LENGTH];
        char      buf[MAX_STRING_LENGTH];
        int       dam;
        int       chance;
        int       vischance;

        argument = one_argument(argument, arg1);

        if (IS_NPC(ch))
                return;

        if (!IS_CLASS(ch, CLASS_THIEF)
            || !IS_SET(ch->pcdata->powers[1], THIEF_TDAGGER))
        {
                stc("Huh?\n\r", ch);
                return;
        }

        if (arg1[0] == '\0')
        {
                send_to_char("#0Throw a dagger at whom?#n\n\r", ch);
                return;
        }

        if ((victim = get_char_room(ch, NULL, arg1)) == NULL)
        {
                send_to_char("#0They aren't here.#n\n\r", ch);
                return;
        }

        if ((victim == ch))
        {
                stc("#0You toss your dagger in the air playfully.#n\n\r", ch);
                return;
        }
        if (is_safe(ch, victim))
        {
                stc("No.\n\r", ch);
                return;
        }
        if (((obj = get_eq_char(ch, WEAR_WIELD)) == NULL
             || obj->value[3] != 11)
            && ((obj = get_eq_char(ch, WEAR_HOLD)) == NULL
                || obj->value[3] != 11))
        {
                send_to_char("#0You need to wield a piercing weapon.#n\n\r",
                             ch);
                return;
        }

        if (ch->move < 1000)
        {
                stc("#0You do not have the required #R1000 #rm#Rove#n.\n\r",
                    ch);
                return;
        }

        vischance = number_range(1, 100);
        chance = number_range(1, 100);

        if (chance >= 95)   //Head Shot
        {
                if ((obj = get_eq_char(victim, ITEM_WEAR_HEAD)) == NULL)
                {
                        dam = number_range(ch->damcap[DAM_CAP] * 2.5,
                                           ch->damcap[DAM_CAP] * 3);
                }
                else
                {
                        dam = number_range(ch->damcap[DAM_CAP] * 1.9,
                                           ch->damcap[DAM_CAP] * 2.3);
                }
                act("#R$n#0 hurls a #7dagger #0at #r$N, #0hitting them right in the forehead!#n", ch, NULL, victim, TO_NOTVICT);
                xprintf(buf,
                        "#0You hurl a #7dagger #0at #R$N, #0hitting $M right in #S forehead!#n   #r[#R%d#r]#n",
                        dam);
                act(buf, ch, NULL, victim, TO_CHAR);
                xprintf(buf,
                        "#0A #7dagger #0flies out of nowhere and hits you in the forehead!  #RSHIT that fucking hurt!#n  #r[#R%d#r]#n",
                        dam);
                stc(buf, victim);
        }

        else if (chance >= 90)  //Neck Hit
        {
                if ((obj = get_eq_char(victim, ITEM_WEAR_NECK)) == NULL)
                {
                        dam = number_range(ch->damcap[DAM_CAP] * 2,
                                           ch->damcap[DAM_CAP] * 2.5);
                }
                else
                {
                        dam = number_range(ch->damcap[DAM_CAP] * 1.5,
                                           ch->damcap[DAM_CAP] * 2.3);
                }
                act("#R$n#0 hurls a #7dagger #0at #r$N, #Rpenetrating #0$S neck!#n", ch, NULL, victim, TO_NOTVICT);
                xprintf(buf,
                        "#0You hurl a #7dagger #0at #R$N, penetrating #0$S neck!#n   #r[#R%d#r]#n",
                        dam);
                act(buf, ch, NULL, victim, TO_CHAR);
                xprintf(buf,
                        "#0A #7dagger #0flies out of nowhere and #Rimpales #0your neck!  #RSHIT that fucking hurt!#n  #r[#R%d#r]#n\n\r",
                        dam);
                stc(buf, victim);
                SET_BIT(victim->loc_hp[6], BLEEDING_THROAT);
        }

        else if (chance >= 30)  //General Chest Hit
        {
                if ((obj = get_eq_char(victim, ITEM_WEAR_BODY)) == NULL)
                {
                        dam = number_range(ch->damcap[DAM_CAP] * 1.8,
                                           ch->damcap[DAM_CAP] * 2);
                }
                else
                {
                        dam = number_range(ch->damcap[DAM_CAP] - 200,
                                           ch->damcap[DAM_CAP] + 200);
                }
                act("#R$n#0 hurls a #7dagger #0at #r$N, #Rpiercing #0into #0$S chest!#n", ch, NULL, victim, TO_NOTVICT);
                xprintf(buf,
                        "#0You hurl a #7dagger #0at #R$N, piercing #0into $S chest!#n   #r[#R%d#r]#n",
                        dam);
                act(buf, ch, NULL, victim, TO_CHAR);
                xprintf(buf,
                        "#0A #7dagger #0flies out of nowhere and #Rpierces #0deep into your chest!#n  #r[#R%d#r]#n\n\r#n",
                        dam);
                stc(buf, victim);
        }

        else if (chance >= 2)   //Leg Hit
        {
                if ((obj = get_eq_char(victim, ITEM_WEAR_LEGS)) == NULL)
                {
                        dam = number_range(ch->damcap[DAM_CAP] * 0.9,
                                           ch->damcap[DAM_CAP] * 1.2);
                }
                else
                {
                        dam = number_range(ch->damcap[DAM_CAP] - 200,
                                           ch->damcap[DAM_CAP] - 400);
                }
                act("#R$n#0 hurls a #7dagger #0at #r$N, #Rdigging #0into #0$S leg!#n", ch, NULL, victim, TO_NOTVICT);
                xprintf(buf,
                        "#0You hurl a #7dagger #0at #R$N, digging #0into $S leg!#n   #r[#R%d#r]#n",
                        dam);
                act(buf, ch, NULL, victim, TO_CHAR);
                xprintf(buf,
                        "#0A #7dagger #0flies out of nowhere and #Rdigs #0deep into your leg!#n  #r[#R%d#r]#n\n\r#n",
                        dam);
                stc(buf, victim);
        }

        else if (chance < 2 && victim->sex == 1)    //OW thats just NOT right, what the hell do they teach you thieves anyhow??
        {
                dam = number_range(ch->damcap[DAM_CAP] * 2,
                                   ch->damcap[DAM_CAP] * 3);

                act("#R$n#0 hurls a #7dagger #0at #r$N, #0hitting him in a rather.. uncompromising location!#n", ch, NULL, victim, TO_NOTVICT);
                xprintf(buf,
                        "#0You hurl a #7dagger #0at #R$N, #0hitting him in a rather.. uncompromising location!#n   #r[#R%d#r]#n",
                        dam);
                act(buf, ch, NULL, victim, TO_CHAR);
                xprintf(buf,
                        "#RYou whimper pitifully as you take a throwing dagger to the crotch!#n  #r[#R%d#r]#n\n\r#n",
                        dam);
                stc(buf, victim);
                xprintf(buf,
                        "#0HAHA #R%s #0has just taken a throwing dagger to the crotch!#n",
                        IS_NPC(victim) ? victim->short_descr : victim->
                        pcdata->switchname);
                do_info(victim, buf);
        }

        else
        {
                stc("You failed!\n\r", ch);
                return;
        }

        hurt_person(ch, victim, dam);
        ch->move -= 1000;
        if (victim->hit < -10)
        {
                victim->hit = -10;
        }
        if (IS_SET(ch->act, PLR_WIZINVIS) && vischance >= 65)   //The check for coming out of hiding.
        {
                stc("#0You take a moment to catch your balance and remain unnoticed in the shadows!#n\n\r", ch);
                WAIT_STATE(ch, 8);
                return;
        }
        if (IS_SET(ch->act, PLR_WIZINVIS) && vischance < 65)
        {
                stc("#0You come out of hiding!#n\n\r", ch);
                REMOVE_BIT(ch->act, PLR_WIZINVIS);
        }
        WAIT_STATE(ch, 5);
        if (ch->fighting == NULL)
        {
                ch->fighting = victim;
        }
        return;
}

void do_dtrick(CHAR_DATA * ch, char *argument)
{
        CHAR_DATA *victim;
        OBJ_DATA *obj;
        char      arg1[MAX_INPUT_LENGTH];
        char      buf[MAX_STRING_LENGTH];
        int       randnum;
        int       successchance;

        argument = one_argument(argument, arg1);

        if (IS_NPC(ch))
                return;

        if (!IS_CLASS(ch, CLASS_THIEF)
            || !IS_SET(ch->pcdata->powers[1], THIEF_DTRICK))
        {
                stc("Huh?\n\r", ch);
                return;
        }

        if (ch->move < 2500)
        {
                stc("#0You don't have the required amount of move to preform a Dirty Trick!#n\n\r", ch);
                return;
        }

        if (arg1[0] == '\0')
        {
                stc("#0Preform a Dirty Trick on whom?#n\n\r", ch);
                return;
        }

        if ((victim = get_char_room(ch, NULL, arg1)) == NULL)
        {
                send_to_char("#0They aren't here.#n\n\r", ch);
                return;
        }


        randnum = number_range(1, 4);   //Disarm, Trip, Foot Stomp, Hilt Smash.

        if (randnum == 1)   //<----Disarm
        {
                if (((obj = get_eq_char(victim, WEAR_WIELD)) == NULL)
                    || obj->item_type != ITEM_WEAPON)
                {
                        if (((obj = get_eq_char(victim, WEAR_HOLD)) == NULL)
                            || obj->item_type != ITEM_WEAPON)
                                stc("They're not wielding anything to disarm!!#n\n\r", ch);
                        return;
                }

                if (IS_IMMUNE(victim, IMM_DISARM))
                {
                        successchance = number_range(1, 75);
                }

                else
                {
                        successchance = number_range(1, 100);
                }

                if (successchance < 50)
                {
                        stc("#0You try to preform a dirty trick, but fail!#n\n\r", ch);
                        ch->move -= 500;
                        WAIT_STATE(ch, 1 * PULSE_VIOLENCE);
                        return;
                }

                if (successchance >= 50)
                {
                        xprintf(buf,
                                "#R$n #0slices $s #7dagger #0sneakily accross your wrist, causing you too lose your grip!#n\n\r");
                        act(buf, ch, NULL, victim, TO_VICT);
                        xprintf(buf,
                                "#0You sneakily slice your dagger across #R$N's #0wrist, causing them to lose their grip!#n\n\r");
                        act(buf, ch, NULL, victim, TO_CHAR);

                        obj_from_char(obj);
                        obj_to_room(obj, victim->in_room);
                        ch->move -= 2500;
                        hurt_person(ch, victim, 250);
                        WAIT_STATE(ch, 1 * PULSE_VIOLENCE);
                        return;
                }
        }

        else if (randnum == 2)  //<----Trip
        {
                if (IS_AFFECTED(victim, AFF_FLYING))
                        return;

                successchance = number_range(1, 100);

                if (successchance < 50)
                {
                        stc("#0You attempt a dirty trick but fail!#n\n\r",
                            ch);
                        ch->move -= 500;
                        WAIT_STATE(ch, 1 * PULSE_VIOLENCE);
                        return;
                }
                if (successchance >= 50 && victim->wait == 0)
                {
                        xprintf(buf,
                                "#R$n #0kicks your shins, causing your legs to buckle!#n\n\r");
                        act(buf, ch, NULL, victim, TO_VICT);
                        xprintf(buf,
                                "#0You kick #R$N #0in the shins, causing $S legs to buckle!#n\n\r");
                        act(buf, ch, NULL, victim, TO_CHAR);
                        xprintf(buf,
                                "#R$n #0kicks #R$N #0in the shins, causing $S legs to buckle!#n\n\r");
                        act(buf, ch, NULL, victim, TO_NOTVICT);
                        ch->move -= 2500;
                        WAIT_STATE(ch, 1 * PULSE_VIOLENCE);
                        hurt_person(ch, victim, 500);
                        WAIT_STATE(victim, 2 * PULSE_VIOLENCE);
                        victim->position = POS_RESTING;
                        return;
                }
        }

        else if (randnum == 3)  //<---Foot Stomp
        {
                if (IS_AFFECTED(victim, AFF_FLYING))
                        return;

                successchance = number_range(1, 100);

                if (successchance < 50)
                {
                        stc("#0You attempt to preform a Dirty Trick but fail!#n\n\r", ch);
                        ch->move -= 500;
                        WAIT_STATE(ch, 1 * PULSE_VIOLENCE);
                        return;
                }

                if (successchance >= 50)
                {
                        xprintf(buf, "#R$n #0stomps on your feet! OW!#n\n\r");
                        act(buf, ch, NULL, victim, TO_VICT);
                        xprintf(buf, "#0You stomp on #R$N's #0feet!#n\n\r");
                        act(buf, ch, NULL, victim, TO_CHAR);
                        xprintf(buf, "#R$n #0stomps on #R$N's #0feet!#n\n\r");
                        act(buf, ch, NULL, victim, TO_NOTVICT);
                        ch->move -= 2500;
                        WAIT_STATE(ch, 1 * PULSE_VIOLENCE);
                        hurt_person(ch, victim, 500);
                        WAIT_STATE(victim, 3 * PULSE_VIOLENCE);
                        return;
                }
        }

        else if (randnum == 4)  //<---Hilt Bash
        {
                successchance = number_range(1, 100);
                {
                        if (successchance < 50)
                        {
                                stc("#0You attempt a Dirty Trick, but fail!#n\n\r", ch);
                                ch->move -= 500;
                                WAIT_STATE(ch, 1 * PULSE_VIOLENCE);
                                return;
                        }
                        if (successchance >= 50)
                        {
                                xprintf(buf,
                                        "#R$n BASHES #0his jeweled dagger hilt into your face! You reel back, stunned!#n\n\r");
                                act(buf, ch, NULL, victim, TO_VICT);
                                xprintf(buf,
                                        "#0You BASH your dagger hilt into #R$N's #0face!#n\n\r");
                                act(buf, ch, NULL, victim, TO_CHAR);
                                xprintf(buf,
                                        "#R$n #RBASHES #0his dagger hilt into #R$N's #0face, causing them to reel back stunned!#n\n\r");
                                act(buf, ch, NULL, victim, TO_NOTVICT);
                                act("Your nose shatters under the impact of the blow!", victim, NULL, NULL, TO_CHAR);
                                act("$n's nose shatters under the impact of the blow!", victim, NULL, NULL, TO_ROOM);
                                SET_BIT(victim->loc_hp[LOC_HEAD],
                                        BROKEN_NOSE);
                                ch->move -= 2500;
                                hurt_person(ch, victim, 1000);
                                WAIT_STATE(ch, 1 * PULSE_VIOLENCE);
                                WAIT_STATE(victim, 1 * PULSE_VIOLENCE);
                                victim->position = POS_STUNNED;
                                return;
                        }
                        return;
                }
        }
}

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

        OBJ_DATA *obj;
        char      arg[MAX_INPUT_LENGTH];

        argument = one_argument(argument, arg);

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

        if (!IS_SET(ch->pcdata->powers[1], THIEF_POISONBLADE))
        {
                stc("Huh?\n\r", ch);
                return;
        }

        if (arg[0] == '\0')
        {
                stc("Poison What?\n\r", ch);
                return;
        }

        if ((obj = get_obj_carry(ch, arg, ch)) == NULL)
        {
                send_to_char("You dont have that item.\n\r", ch);
                return;
        }

        if (obj->item_type != ITEM_WEAPON)
        {
                send_to_char("You can only poison weapons!\n\r", ch);
                return;
        }

        if (IS_SET(obj->quest, QUEST_WWPOISON))
        {
                send_to_char
                        ("#0This item has already been #gP#Goisone#gd!#n.\n\r",
                         ch);
                return;
        }

        if (IS_SET(obj->extra_flags, ITEM_FIREENCHANT)
            || IS_SET(obj->extra_flags, ITEM_ICEENCHANT)
            || IS_SET(obj->extra_flags, ITEM_ELECENCHANT))
        {
                stc("That weapon has already been enchanted!\n\r", ch);
                return;
        }

        SET_BIT(obj->quest, QUEST_WWPOISON);
        stc("#0You coat your weapon in foul smelling #gp#Goiso#gn!#n\n\r",
            ch);
        obj->timer = 35;
        return;
}

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

        if (IS_NPC(ch))
                return;

        argument = one_argument(argument, arg);

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

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

        if ((victim = get_char_world(ch, arg)) == NULL)
        {
                send_to_char("You cannot find them.\n\r", ch);
                return;
        }

        if (ch->move < 500)
        {
                stc("You don't have enough movement points to stalk them.\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 body can't go there.\n\r", ch);
                return;
        }

        if (ch == victim)
        {
                send_to_char("But you're already at yourself!\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 (!IS_NPC(victim) && !IS_IMMUNE(victim, IMM_SUMMON))
        {
                send_to_char("They are hiding from you.\n\r", ch);
                return;
        }
        if (victim->in_room == ch->in_room)
        {
                send_to_char("But you're already there!\n\r", ch);
                return;
        }

        act("You pick up the trail of $N, and quickly find them.", ch, NULL,
            victim, TO_CHAR);
        act("$n slides into the shadows, stalking someone.", ch, NULL, victim,
            TO_ROOM);
        char_from_room(ch);
        char_to_room(ch, victim->in_room);
        ch->move -= 500;
        act("$n walks out of nowhere behind $N.", ch, NULL, victim,
            TO_NOTVICT);
        act("$n walks out of nowhere from behind.", ch, NULL, victim,
            TO_VICT);
        do_look(ch, "scry");
        return;
}