/* NOTE, THIS IS A QUICK CODE PIECED TOGETHER IN HORRIBLE FASHION!
*
*
* This is a cheap WEAPON_DISPEL flag to allow for very powerful
* weapon dispels on striking. I threw it together very quickly
* and will probably be revamping the fight.c code in due time.
* I require no credits for this snippet because:
*
* 1. It's quite easy to do.
* 2. It's probably been posted before.
* 3. It's a dispel code, not something original like an ASCII Automapper.
*
* Go ahead and use this code as freely as you want.
* Hack it up and slash it up, and flush it down the toilet and write
* a better one. I just threw this together in a hurry to test
* WEAPON_DISPEL flags.
*
*
* I compiled this code using QuickMUD so it should compile for
* most ROM based MUDs. This code is as-is. I will not offer
* any help to anyone because I'm not the best guy to be asking for help :)
*
*
*
*
*
*
* If you feel the code is dispelling too often, or not enough,
* change the numbers in: fight.c
*
*
* wskill = 15 * get_weapon_skill (ch, get_weapon_sn(ch)) / 100;
*
*
* The % chance to dispel is based on how well the character is skilled
* with the weapon he/she is using. With the above line, the maximum %
* chance to dispel is 15%
*
*
* Vexor, mudgod_dave@yahoo.com
* http://madhax.homedns.org
*
*
*/
---- in merc.h, under the /* weapon types */ -----
#define WEAPON_FLAMING (A)
#define WEAPON_FROST (B)
#define WEAPON_VAMPIRIC (C)
#define WEAPON_SHARP (D)
#define WEAPON_VORPAL (E)
#define WEAPON_TWO_HANDS (F)
#define WEAPON_SHOCKING (G)
#define WEAPON_POISON (H)
#define WEAPON_DISPEL (I) /* ADD WEAPON_DISPEL AT FIRST AVAILABLE FLAG, MINE WAS (I) */
---- in act_obj.c, in function do_envenom /*OPTIONAL*/ -----
/*This prevents PC's from envenoming a DISPEL weapon */
find:
if (obj->item_type == ITEM_WEAPON)
{
if (IS_WEAPON_STAT (obj, WEAPON_FLAMING)
|| IS_WEAPON_STAT (obj, WEAPON_FROST)
|| IS_WEAPON_STAT (obj, WEAPON_VAMPIRIC)
|| IS_WEAPON_STAT (obj, WEAPON_SHARP)
|| IS_WEAPON_STAT (obj, WEAPON_VORPAL)
|| IS_WEAPON_STAT (obj, WEAPON_SHOCKING)
|| IS_OBJ_STAT (obj, ITEM_BLESS)
|| IS_OBJ_STAT (obj, ITEM_BURN_PROOF))
Add, so it looks like:
if (obj->item_type == ITEM_WEAPON)
{
if (IS_WEAPON_STAT (obj, WEAPON_FLAMING)
|| IS_WEAPON_STAT (obj, WEAPON_FROST)
|| IS_WEAPON_STAT (obj, WEAPON_VAMPIRIC)
|| IS_WEAPON_STAT (obj, WEAPON_SHARP)
|| IS_WEAPON_STAT (obj, WEAPON_VORPAL)
|| IS_WEAPON_STAT (obj, WEAPON_SHOCKING)
|| IS_OBJ_STAT (obj, ITEM_BLESS)
|| IS_OBJ_STAT (obj, ITEM_BURN_PROOF)
|| IS_OBJ_STAT (obj, WEAPON_DISPEL))
---- in handler.c, in char *weapon_bit_name ----
Add:
if (weapon_flags & WEAPON_DISPEL)
strcat (buf, " dispels-magic");
---- in magic.c, in void spell_poison, /*OPTIONAL*/ ----
---- Find: ----
if (obj->item_type == ITEM_WEAPON)
{
if (IS_WEAPON_STAT (obj, WEAPON_FLAMING)
|| IS_WEAPON_STAT (obj, WEAPON_FROST)
|| IS_WEAPON_STAT (obj, WEAPON_VAMPIRIC)
|| IS_WEAPON_STAT (obj, WEAPON_SHARP)
|| IS_WEAPON_STAT (obj, WEAPON_VORPAL)
|| IS_WEAPON_STAT (obj, WEAPON_SHOCKING)
|| IS_OBJ_STAT (obj, ITEM_BLESS)
|| IS_OBJ_STAT (obj, ITEM_BURN_PROOF))
---- Add: so it looks like, ----
if (obj->item_type == ITEM_WEAPON)
{
if (IS_WEAPON_STAT (obj, WEAPON_FLAMING)
|| IS_WEAPON_STAT (obj, WEAPON_FROST)
|| IS_WEAPON_STAT (obj, WEAPON_VAMPIRIC)
|| IS_WEAPON_STAT (obj, WEAPON_SHARP)
|| IS_WEAPON_STAT (obj, WEAPON_VORPAL)
|| IS_WEAPON_STAT (obj, WEAPON_SHOCKING)
|| IS_OBJ_STAT (obj, ITEM_BLESS)
|| IS_OBJ_STAT (obj, ITEM_BURN_PROOF)
|| IS_OBJ_STAT (obj, WEAPON_DISPEL))
---- in tables.c, in const struct flag_type weapon_type2[] ----
const struct flag_type weapon_type2[] = {
{"flaming", WEAPON_FLAMING, TRUE},
{"frost", WEAPON_FROST, TRUE},
{"vampiric", WEAPON_VAMPIRIC, TRUE},
{"sharp", WEAPON_SHARP, TRUE},
{"vorpal", WEAPON_VORPAL, TRUE},
{"twohands", WEAPON_TWO_HANDS, TRUE},
{"shocking", WEAPON_SHOCKING, TRUE},
{"poison", WEAPON_POISON, TRUE},
{"dispels-magic", WEAPON_DISPEL, TRUE}, /* ADDED DISPEL PROPERTY FOR 'identify' and 'stat' and OLC */
{NULL, 0, 0}
};
---- in fight.c, in one_hit, ----
--- Find: ---
int dam;
if (ch->fighting == victim && IS_WEAPON_STAT (wield, WEAPON_POISON))
{
int level;
AFFECT_DATA *poison, af;
---- Add this above the 'int dam;' statement ----
/* WEAPON_DISPEL PROPERTY */
if (ch->fighting == victim && IS_WEAPON_STAT(wield, WEAPON_DISPEL))
{
int wskill;
int chance = number_percent();
char buf[MAX_STRING_LENGTH];
int sn;
AFFECT_DATA *af;
wskill = 15 * get_weapon_skill (ch, get_weapon_sn(ch)) / 100;
if ( chance < wskill )
{
/*if ( number_percent() < 10 )
{*/
for ( sn = 0; sn < MAX_SKILL; sn++ )
{
if (is_affected (victim, sn))
{
for (af = victim->affected; af != NULL; af = af->next)
{
if (af->type == sn)
{
affect_strip (victim, sn);
if (skill_table[sn].msg_off)
{
send_to_char (skill_table[sn].msg_off, victim);
send_to_char ("\n\r", victim);
if (skill_table[sn].name != NULL)
{
sprintf(buf,"{M%s {Mdispels %s's %s!{x\n\r",wield->short_descr,
victim->name, skill_table[sn].name);
send_to_char(buf,ch);
}
}
return;
}
af->level--;
}
}
}
}
}