/* =========================================================================== This snippet was written by Erwin S. Andreasen, erwin@andreasen.org. You may use this code freely, as long as you retain my name in all of the files. You also have to mail me telling that you are using it. Note, however, that I DO NOT OFFER ANY SUPPORT ON THIS CODE. If you have a problem installing it, this means you probably SHOULD NOT BE RUNNING A MUD. All my snippets are publically available at: http://www.andreasen.org/ =========================================================================== Note that function prototypes are not included in this code - remember to add them to merc.h yourself - also add the 'second' command to interp.c. Secondary weapon code prototype. You should probably do a clean compile on this one, due to the change to the MAX_WEAR define. Last update: Oct 10, 1995 Should work on : MERC2.2 Fixed since last update: Know bugs and limitations yet to be fixed: Comments: */ /* in the beginning of act_info.c, add a to the table: */ char * const where_name [] = { " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " " /* ADD THIS */ }; /* in act_obj.c, add this command */ /* also remember to add it to interp.c, declare it in merc.h etc. */ void do_second (CHAR_DATA *ch, char *argument) /* wear object as a secondary weapon */ { OBJ_DATA *obj; char buf[MAX_STRING_LENGTH]; /* overkill, but what the heck */ if (argument[0] == '\0') /* empty */ { send_to_char ("Wear which weapon in your off-hand?\n\r",ch); return; } obj = get_obj_carry (ch, argument); /* find the obj withing ch's inventory */ if (obj == NULL) { send_to_char ("You have no such thing in your backpack.\n\r",ch); return; } /* check if the char is using a shield or a held weapon */ if ( (get_eq_char (ch,WEAR_SHIELD) != NULL) || (get_eq_char (ch,WEAR_HOLD) != NULL) ) { send_to_char ("You cannot use a secondary weapon while using a shield or holding an item\n\r",ch); return; } if ( ch->level < obj->level ) { sprintf( buf, "You must be level %d to use this object.\n\r", obj->level ); send_to_char( buf, ch ); act( "$n tries to use $p, but is too inexperienced.", ch, obj, NULL, TO_ROOM ); return; } /* check that the character is using a first weapon at all */ if (get_eq_char (ch, WEAR_WIELD) == NULL) /* oops - != here was a bit wrong :) */ { send_to_char ("You need to wield a primary weapon, before using a secondary one!\n\r",ch); return; } /* check for str - secondary weapons have to be lighter */ if ( get_obj_weight( obj ) > ( str_app[get_curr_str(ch)].wield / 2) ) { send_to_char( "This weapon is too heavy to be used as a secondary weapon by you.\n\r", ch ); return; } /* check if the secondary weapon is at least half as light as the primary weapon */ if ( (get_obj_weight (obj)*2) > get_obj_weight(get_eq_char(ch,WEAR_WIELD)) ) { send_to_char ("Your secondary weapon has to be considerably lighter than the primary one.\n\r",ch); return; } /* at last - the char uses the weapon */ if (!remove_obj(ch, WEAR_SECONDARY, TRUE)) /* remove the current weapon if any */ return; /* remove obj tells about any no_remove */ /* char CAN use the item! that didn't take long at aaall */ act ("$n wields $p in $s off-hand.",ch,obj,NULL,TO_ROOM); act ("You wield $p in your off-hand.",ch,obj,NULL,TO_CHAR); equip_char ( ch, obj, WEAR_SECONDARY); return; } /* in the wear_obj function, replace the shield and wield sections with this: */ /* shield section */ if ( CAN_WEAR( obj, ITEM_WEAR_SHIELD ) ) { if (get_eq_char (ch, WEAR_SECONDARY) != NULL) { send_to_char ("You cannot use a shield while using 2 weapons.\n\r",ch); return; } if ( !remove_obj( ch, WEAR_SHIELD, fReplace ) ) return; act( "$n wears $p as a shield.", ch, obj, NULL, TO_ROOM ); act( "You wear $p as a shield.", ch, obj, NULL, TO_CHAR ); equip_char( ch, obj, WEAR_SHIELD ); return; } /* wield section */ if ( CAN_WEAR( obj, ITEM_HOLD ) ) { if (get_eq_char (ch, WEAR_SECONDARY) != NULL) { send_to_char ("You cannot hold an item while using 2 weapons.\n\r",ch); return; } if ( !remove_obj( ch, WEAR_HOLD, fReplace ) ) return; act( "$n holds $p in $s hands.", ch, obj, NULL, TO_ROOM ); act( "You hold $p in your hands.", ch, obj, NULL, TO_CHAR ); equip_char( ch, obj, WEAR_HOLD ); return; } /* in merc.h, extend the WEAR_ constants: */ /* * Equpiment wear locations. * Used in #RESETS. */ /* current #define bla bla bla */ #define WEAR_SECONDARY 18 #define MAX_WEAR 19 /* and most important, in fight.c: */ /* change the prototype in the beginning of the file: */ void one_hit args( ( CHAR_DATA *ch, CHAR_DATA *victim, int dt, bool secondary ) ); /* in multi_hit, add this right after the first hit is resolved */ if (get_eq_char (ch, WEAR_SECONDARY)) { one_hit( ch, victim, dt, TRUE ); if ( ch->fighting != victim ) return; } /* also, add an extra parameter, FALSE, to all of the one_hit calls */ /* finally, change one_hit: */ void one_hit ( CHAR_DATA *ch, CHAR_DATA *victim, int dt, bool secondary ) /* .... */ /* * Figure out the type of damage message. * if secondary == true, use the second weapon. */ if (!secondary) wield = get_eq_char( ch, WEAR_WIELD ); else wield = get_eq_char( ch, WEAR_SECONDARY );