[Blade Thirst] Blade Thirst Skill. For Mages or (if availeble) Necromancers. 1. Place the blade.c file in your src directory 2. Add blade.o in your makefile 3. Add the following in const.c (behind poison weapon would be fine) { "blade thirst", { 15, L_APP, L_APP, L_APP, L_APP }, spell_null, TAR_OBJ_INV, POS_STANDING, &gsn_bladethirst, 0, 12, "", "!Blade Thirst!" }, 4. Add the following to db.c in the Globals section. (again after poison weapon) int gsn_bladethirst; 5. Add this line in the command table of your interp.c file { "blade thirst", do_bladethirst, POS_STANDING, 0, LOG_NORMAL }, 6. Finally add these lines to your merc.h file.... extern int gsn_bladethirst; DECLARE_DO_FUN( do_bladethirst ); 7. Add the following defines to merc.h ITEM_BLADE_THIRST and OBJ_VNUM_MITHRIL 8. Cut this code out of this file and place it in blade.c ---===---===---===---===---===---===---===---===---===---===---===---===---=== /*************************************************************************** * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, * * Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. * * * * Merc Diku Mud improvements copyright (C) 1992, 1993 by Michael * * Chastain, Michael Quan, and Mitchell Tse. * * * * Envy Diku Mud improvements copyright (C) 1994 by Michael Quan, David * * Love, Guilherme 'Willie' Arnold, and Mitchell Tse. * * * * EnvyMud 2.0 improvements copyright (C) 1995 by Michael Quan and * * Mitchell Tse. * * * * In order to use any part of this Envy Diku Mud, you must comply with * * the original Diku license in 'license.doc', the Merc license in * * 'license.txt', as well as the Envy license in 'license.nvy'. * * In particular, you may not remove either of these copyright notices. * * * * 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. * ***************************************************************************/ /*************************************************************************** * This skill was designed by the Maniac of Mythran Mud. * * It is copyright (C) 1995 1996 by Mark Janssen (a.k.a The Maniac). * * Some portions of this code are copied from Thelonius' poison weapon. * * please comply with the envy, diku and merc licenses. * ***************************************************************************/ #if defined( macintosh ) #include #else #include #endif #include #include #include #include #include #include "merc.h" /* Poison weapon by Thelonius for EnvyMud */ /* Blade thirst code is a changed version of poison weapon */ /* Written by The Maniac. This skill came from the internet book */ /* The Tome of Mighty Magic */ void do_bladethirst( CHAR_DATA *ch, char *argument ) { OBJ_DATA *obj; OBJ_DATA *pobj; OBJ_DATA *wobj; AFFECT_DATA *paf; char arg [ MAX_INPUT_LENGTH ]; if ( !IS_NPC( ch ) && ch->level < skill_table[gsn_bladethirst].skill_level[ch->class] ) { send_to_char( "What do you think you are, a necromancer?\n\r", ch ); return; } one_argument( argument, arg ); if ( arg[0] == '\0' ) { send_to_char( "What are you trying to do...?\n\r", ch ); return; } if ( ch->fighting ) { send_to_char( "While you're fighting? Nice try.\n\r", ch ); return; } if ( !( obj = get_obj_carry( ch, arg ) ) ) { send_to_char( "You do not have that weapon.\n\r", ch ); return; } if ( obj->item_type != ITEM_WEAPON ) { send_to_char( "That item is not a weapon.\n\r", ch ); return; } if ( IS_OBJ_STAT( obj, ITEM_BLADE_THIRST ) ) { send_to_char( "That weapon is already thirsty.\n\r", ch ); return; } /* Now we have a valid weapon...check to see if we have the bar of mithril. */ for ( pobj = ch->carrying; pobj; pobj = pobj->next_content ) { if ( pobj->pIndexData->vnum == OBJ_VNUM_MITHRIL ) break; } if ( !pobj ) { send_to_char( "You do not have the mithril.\n\r", ch ); return; } /* Okay, we have the mithril...do we have blood? */ for ( wobj = ch->carrying; wobj; wobj = wobj->next_content ) { if ( wobj->item_type == ITEM_DRINK_CON && wobj->value[1] > 0 && wobj->value[2] == 13 ) break; } if ( !wobj ) { send_to_char( "You need some blood for this skill.\n\r", ch ); return; } /* Great, we have the ingredients...but is the ch smart enough? */ if ( !IS_NPC( ch ) && get_curr_wis( ch ) < 17 ) { send_to_char( "You can't quite remember what to do...\n\r", ch ); return; } /* And does he have steady enough hands? */ if ( !IS_NPC( ch ) && ( get_curr_dex( ch ) < 17 || ch->pcdata->condition[COND_DRUNK] > 0 ) ) { send_to_char( "Your hands aren't steady enough to properly mix the ingredients.\n\r", ch ); return; } WAIT_STATE( ch, skill_table[gsn_bladethirst].beats ); /* Check the skill percentage */ if ( !IS_NPC( ch ) && number_percent( ) > ch->pcdata->learned[gsn_bladethirst] ) { send_to_char( "You failed and spill some on yourself. Ouch!\n\r", ch ); damage( ch, ch, ch->level * 2, gsn_bladethirst, WEAR_NONE ); act( "$n spills the blade thirst liquid all over!", ch, NULL, NULL, TO_ROOM ); extract_obj( pobj ); extract_obj( wobj ); return; } /* Well, I'm tired of waiting. Are you? */ act( "You mix $p in $P, creating an evil looking potion!", ch, pobj, wobj, TO_CHAR ); act( "$n mixes $p in $P, creating an evil looking potion!", ch, pobj, wobj, TO_ROOM ); act( "You pour the potion over $p, which glistens wickedly!", ch, obj, NULL, TO_CHAR ); act( "$n pours the potion over $p, which glistens wickedly!", ch, obj, NULL, TO_ROOM ); SET_BIT( obj->extra_flags, ITEM_BLADE_THIRST ); obj->cost *= ch->level; /* Set an object timer. Dont want proliferation of poisoned weapons */ obj->timer = 10 + ch->level; if ( IS_OBJ_STAT( obj, ITEM_BLESS ) ) obj->timer *= 2; if ( IS_OBJ_STAT( obj, ITEM_MAGIC ) ) obj->timer *= 2; /* WHAT? All of that, just for that one bit? How lame. ;) */ act( "The remainder of the potion eats through $p.", ch, wobj, NULL, TO_CHAR ); act( "The remainder of the potion eats through $p.", ch, wobj, NULL, TO_ROOM ); extract_obj( pobj ); extract_obj( wobj ); if ( !affect_free ) { paf = alloc_perm( sizeof( *paf ) ); } else { paf = affect_free; affect_free = affect_free->next; } paf->type = -1; paf->duration = -1; paf->location = APPLY_HITROLL; paf->modifier = 3; paf->bitvector = 0; paf->next = obj->affected; obj->affected = paf; return; }