The Special Weapon BUG for EmberMUD
                      Fix Sheet by Rindar (Ron Cole)
                     Code from ROM 2.4 by Russ Taylor
                    Adaptions made by Raven and Rindar

The Bug:  Have you ever set the special weapon flag on a sword to 
flaming and wondered why nothing special seems to happen when you 
attack with it?  Well, the reason is that a large chunk of the 
special weapons code was left out of EmberMUD.  Because of this, 
the only thing the special weapon flags do are give another line of 
text to every item.  Not very impressive, is it?

The Check:  Set the special flag on a weapon to vampiric.  Load the 
weapon and then attack with it.  If you don't see any life-draining 
or some other unusual message, you have the bug.

The Bugfix:  You need to give special weapons the power to do 
damage, and that happens in fight.c.  Specificly, it happens in 
the functions one_hit and second_one_hit.  Here's how to do it:

        1)  Open fight.c
        2)  Find the function "void one_hit"
        3)  Find the line:  damage( ch, victim, dam, dt, dam_type );
          In this case, it is at the end of the file right before 
          the last call of tail_chain( );  This is how it looks in 
          the code:
        
    dam += GET_DAMROLL(ch) * UMIN(100,skill) /100;

    if ( dam <= 0 )
        dam = 1;

    damage( ch, victim, dam, dt, dam_type );
        
        
        4)  Insert the snippet at the end of this file right 
          after the above line.
        5)  Repeat the above steps, only this time do it in the
          function "void second_one_hit" in fight.c.
        6)  Recompile.  You are done.

  IMPORTANT:  ROM 2.4 included the code for Flaming, Frost, 
  Vampiric, Shocking, and Poison weapons.  EmberMUD does not 
  include the weapon types Shocking or Poison.  If you do not 
  intend to use these weapon types, you should delete them from 
  the snippet below.  If you would like to use them, you must 
  add the proper lines of code in merc.h, bit.c, and handler.c.
  Just mimic what vampiric does in those files, and you should
  be fine.

Notes:  I have not yet tested poison weapons, so I am not sure  
how well this bit of code works, or if it will crash the game.
As well, there is still no code for the sharp, vorpal, or two-
hands special weapons.  Perhaps someone will write it and 
release it, or keep it as a "unique feature" on their EmberMUD.  
Whatever happens, feel free to write me and let me know how the 
code works/what you've done with it.  Improvements would be 
most welcome, and might even be useful to the admins/coders 
of pure ROM MUDs.


-= Rindar
clogar@concentric.net


** Note:  This function is provided "as is" and may be used so long as 
1)  The author's name is kept at the top of the function (if requested) and
2)  all other previous licensing aggreements are abided by.  The author 
assumes no responsibility for problems that occur through use or install-
ation, including lost wages, bugs, deletions, downtimes, etc...  Use at 
your own risk.  All new code is copyrighted by its author.


Special Weapon Snippet:

/*  This is what it should look like in void one_hit before you 
place the function.  The code you should place begins after the 
star slash.
 
    if ( dt == gsn_backstab && wield != NULL) 
        if ( wield->value[0] != 2 )
            dam *= 2 + ch->level / 10; 
        else 
            dam *= 2 + ch->level / 8;

    dam += GET_DAMROLL(ch) * UMIN(100,skill) /100;

    if ( dam <= 0 )
        dam = 1;

    damage( ch, victim, dam, dt, dam_type );

*/
    
    /* but do we have a funky weapon? */
    
    if (wield != NULL && ch->fighting == victim)
    {


        if (IS_WEAPON_STAT(wield,WEAPON_POISON))
        {
  
            int level;
            AFFECT_DATA *poison, af;

            if ((poison = affect_find(wield->affected,gsn_poison)) == NULL)
                level = wield->level;
            else
                level = poison->level;
        
            if (!saves_spell(level / 2,victim)) 
            {
                send_to_char("You feel poison coursing through your veins.",
                    victim);
                act("$n is poisoned by the venom on $p.",
                    victim,wield,NULL,TO_ROOM);

                /*              af.where     = TO_AFFECTS; */
                af.type      = gsn_poison;
                af.level     = level * 3/4;
                af.duration  = level / 2;
                af.location  = APPLY_STR;
                af.modifier  = -1;
                af.bitvector = AFF_POISON;
                affect_join( victim, &af );
            }

            /* weaken the poison if it's temporary */
            if (poison != NULL)
            {
                poison->level = UMAX(0,poison->level - 2);
                poison->duration = UMAX(0,poison->duration - 1);
        
                if (poison->level == 0 || poison->duration == 0)
                    act("The poison on $p has worn off.",ch,wield,NULL,TO_CHAR);
            }
        }


        if (IS_WEAPON_STAT(wield,WEAPON_VAMPIRIC))
        {
            dam = number_range(1, wield->level / 5 + 1);
            act("$p draws life from $n.",victim,wield,NULL,TO_ROOM);
            act("You feel $p drawing your life away.",
                victim,wield,NULL,TO_CHAR);
            damage(ch,victim,dam,0,DAM_NEGATIVE);
            ch->alignment = UMAX(-1000,ch->alignment - 1);
            ch->hit += dam/2;
        }

        if (IS_WEAPON_STAT(wield,WEAPON_FLAMING))
        {
            dam = number_range(1,wield->level / 4 + 1);
            act("$n is burned by $p.",victim,wield,NULL,TO_ROOM);
            act("$p sears your flesh.",victim,wield,NULL,TO_CHAR);
            damage(ch,victim,dam,0,DAM_FIRE);
        }

        if (IS_WEAPON_STAT(wield,WEAPON_FROST))
        {
            dam = number_range(1,wield->level / 6 + 2);
            act("$p freezes $n.",victim,wield,NULL,TO_ROOM);
            act("The cold touch of $p surrounds you with ice.",
                victim,wield,NULL,TO_CHAR);
            damage(ch,victim,dam,0,DAM_COLD);
        }

        if (IS_WEAPON_STAT(wield,WEAPON_SHOCKING))
        {
            dam = number_range(1,wield->level/5 + 2);
            act("$n is struck by lightning from $p.",victim,wield,NULL,TO_ROOM);
            act("You are shocked by $p.",victim,wield,NULL,TO_CHAR);
            damage(ch,victim,dam,0,DAM_LIGHTNING);
        }
    }
    
/*  This is what the end of the function one_hit looks like.
    
    tail_chain( );
    return;
}
*/