/* ------------------------------------------------
 * Varen's Deathgrip, revision 1.01 ... 3/27/98
 * This is the first actual release of this, so
 * there may be some typos (though I tried to
 * copy and paste all the code) or bugs .......
 *
 * deathgrip is a skill that adds a damroll
 * affect to the player, and sets any weapon
 * they are wielding to a death weapon,
 * _while it is wielded_ .. when they remove it
 * it is no longer this type of weapon. As they
 * wield other weapons they become death weapons
 * too. The death flag does a bit of extra damage
 * to good aligned chars, and lowers their alignment
 * if they are PCs.
 *
 * If you choose to use this skill on your mud,
 * feel free to do so, but please send me an email
 * telling me, so I know if this is actually
 * a waste of time or not. Also please mail me with
 * any bugs or suggestions at: [bribe@erols.com]
 *
 * Brian Babey (aka Varen)
 * ------------------------------------------------ */


/* ---------------------------------------------
 * Add in const.c, in the skills/spells table */

    {
        "deathgrip",            { 53, 53, 40, 25 },     { 0, 0, 5, 3},
        spell_null,             TAR_IGNORE,             POS_RESTING,
        NULL,                   SLOT( 0),       0,      12,
        "",                     "The dark shroud leaves your hands.",   ""
    },



/* -----------------------------------------------
 * Add in merc.h, in extra flags for objects */

#define ITEM_DEATH                  (aa)



/* -----------------------------------------------
 * In merc.h, under Game Parameters, increment
 * MAX_SKILL by 1. */



/* -----------------------------------------------
 * In merc.h, under bits for 'affected_by' add
 * this line to the end of the list */

#define AFF_DEATHGRIP           (ee)  /* using an appropriate letter value */



/* ----------------------------------------------
 * In tables.c, under the affect_flags section,
 * add this line, making sure the letter code
 * is the same as the AFF_DEATHGRIP you defined
 * in merc.h                    */

{   "deathgrip",            ee,     TRUE    },




/* -----------------------------------------------
 * Add in interp.h, in the command function section */

DECLARE_DO_FUN( do_deathgrip    );




/* -----------------------------------------------
 * Add in interp.c, to the command table under
 * Object Manipulation Commands */

    { "deathgrip",      do_deathgrip,   POS_RESTING,     0,  LOG_NORMAL, 1 },



/* -----------------------------------------------
 * Now for the code: place this function inside
 * fight.c, preferable in correct alphabetical
 * based on the other fight actions */

void do_deathgrip( CHAR_DATA *ch, char *argument )
{
        int sn;
        OBJ_DATA *obj;
        AFFECT_DATA af;

        sn = skill_lookup("deathgrip");

        if ( IS_AFFECTED(ch,AFF_DEATHGRIP) )
        {
                send_to_char("You already have a grip of death.\n\r",ch);
                return;
        }

        if ( get_skill(ch,sn) < 1 )
        {
                send_to_char("What's that?\n\r",ch);
                return;
        }

        if (  get_skill(ch,sn)  <  (number_range(0, 100))  )
        {
                send_to_char("You failed to create a grip of death.\n",ch);
                check_improve(ch,sn,FALSE,1);
                return;
        }

        obj = get_eq_char(ch,WEAR_WIELD);

        if ( (obj != NULL) && !IS_OBJ_STAT(obj,ITEM_DEATH) )
        {
                SET_BIT( obj->extra_flags, ITEM_DEATH);
                act("$p flickers with dark power.",ch,obj,NULL,TO_ALL);
        }

        /* Now for adding the affect to the player */

        af.where        = TO_AFFECTS;
        af.type         = sn;          
        af.level        = ch->level;
        af.duration     = ch->level / 3;
        af.location     = APPLY_DAMROLL;
        af.modifier     = ch->level / 8;
        af.bitvector    = AFF_DEATHGRIP;

        affect_to_char(ch, &af);

        act("$n's hands are shrouded with a black mist.",ch,NULL,NULL,TO_ROOM);
        send_to_char("Your hands are shrouded with a black mist.\n",ch);

        check_improve(ch,sn,TRUE,1);
}



/* ----------------------------------------------
 * Now in act_obj.c, inside the function wear_obj,
 * find the section on weapons that begins
 * if ( CAN_WEAR( obj, ITEM_WIELD ) )
 * and insert this code just after the line
 * equip_char( ch, obj, WEAR_WIELD );  */

        if ( IS_AFFECTED(ch,AFF_DEATHGRIP) &&
                !IS_OBJ_STAT(obj,ITEM_DEATH) )
        {
                SET_BIT( obj->extra_flags, ITEM_DEATH);
                act("$p flickers with dark power.",ch,obj,NULL,TO_ALL);
        }

        if ( !IS_AFFECTED(ch,AFF_DEATHGRIP) &&
                IS_OBJ_STAT(obj,ITEM_DEATH) )
        {
                REMOVE_BIT(obj->extra_flags, ITEM_DEATH);
        }



/* ----------------------------------------------
 * In act_obj.c, inside the function remove_obj,
 * insert this code before the line reading:
 * unequip_char( ch, obj );                     */

    if ( (obj->item_type == ITEM_WEAPON) && IS_OBJ_STAT(obj,ITEM_DEATH) )
    {
        act( "The black mist around $p fades away.",ch,obj,NULL,TO_ALL);
        REMOVE_BIT(obj->extra_flags,ITEM_DEATH);
    }



/* ----------------------------------------------
 * In fight.c, inside the one_hit function, you will
 * need to insert this code after the shocking weapon
 * effects, which is near the very end of the function */

        if (ch->fighting == victim && IS_OBJ_STAT(wield,ITEM_DEATH))
	{
            dam = number_range(3,wield->level / 4 + 4);
            act("The evil power of $p torments $n.",victim,wield,NULL,TO_ROOM);
            act("The evil power of $p torments you.",victim,wield,NULL,TO_CHAR);
            damage(ch,victim,dam,0,DAM_NEGATIVE,FALSE);

            if ( !IS_NPC(victim) && ( victim->alignment > 0 )  )
                victim->alignment -= 1;
	}


/* ----------------------------------------------
 * In fight.c, in the bonuses section of one_hit
 * (where enhanced damage is figured in) add in
 * this code after the enhanced damage mods   */

    if ( wield != NULL   &&   IS_OBJ_STAT(wield,ITEM_DEATH) )
    {
        if (victim->alignment > 700)
                dam = (110 * dam) / 100;

        else if (victim->alignment > 350)
                dam = (105*dam) / 100;

        else dam = (102*dam) / 100;
    }