diff -ur ../rom2.4/src/act_info.c src/act_info.c --- ../rom2.4/src/act_info.c Mon Oct 23 18:47:54 1995 +++ src/act_info.c Sun Feb 4 00:13:18 1996 @@ -72,6 +72,7 @@ " ", " ", " ", + " " /* ADD THIS */ }; diff -ur ../rom2.4/src/act_obj.c src/act_obj.c --- ../rom2.4/src/act_obj.c Mon Oct 23 18:48:34 1995 +++ src/act_obj.c Sun Feb 4 00:01:23 1996 @@ -1587,6 +1587,11 @@ send_to_char("Your hands are tied up with your weapon!\n\r",ch); return; } + if (get_eq_char (ch, WEAR_SECONDARY) != NULL) + { + send_to_char ("You cannot use a shield while using 2 weapons.\n\r" ,ch); + 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 ); @@ -1651,6 +1656,13 @@ { if ( !remove_obj( ch, WEAR_HOLD, fReplace ) ) return; + + if (get_eq_char (ch, WEAR_SECONDARY) != NULL) + { + send_to_char ("You cannot hold an item while using 2 weapons.\n\r" ,ch); + return; + } + act( "$n holds $p in $s hand.", ch, obj, NULL, TO_ROOM ); act( "You hold $p in your hand.", ch, obj, NULL, TO_CHAR ); equip_char( ch, obj, WEAR_HOLD ); @@ -2957,5 +2969,81 @@ act( buf, keeper, obj, ch, TO_VICT ); ch->reply = keeper; + return; +} + +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 wron g :) */ + { + send_to_char ("You need to wield a primary weapon, before using a seco ndary one!\n\r",ch); + return; + } + + +/* check for str - secondary weapons have to be lighter */ + if ( get_obj_weight( obj ) > ( str_app[get_curr_stat(ch,STAT_STR)].wield / 2) ) + { + send_to_char( "This weapon is too heavy to be used as a secondary weap on by you.\n\r", ch ); + return; + } + +/* check if the secondary weapon is at least half as light as the primary weap on */ + 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 th an 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 n o_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; } diff -ur ../rom2.4/src/fight.c src/fight.c --- ../rom2.4/src/fight.c Mon Oct 23 19:41:59 1995 +++ src/fight.c Sat Feb 3 23:34:15 1996 @@ -69,7 +69,7 @@ int total_levels ) ); bool is_safe args( ( CHAR_DATA *ch, CHAR_DATA *victim ) ); void make_corpse args( ( CHAR_DATA *ch ) ); -void one_hit args( ( CHAR_DATA *ch, CHAR_DATA *victim, int dt ) ); +void one_hit args( ( CHAR_DATA *ch, CHAR_DATA *victim, int dt, bool secondar y ) ); void mob_hit args( ( CHAR_DATA *ch, CHAR_DATA *victim, int d t ) ); void raw_kill args( ( CHAR_DATA *victim ) ); void set_fighting args( ( CHAR_DATA *ch, CHAR_DATA *victim ) ); @@ -223,13 +223,20 @@ return; } - one_hit( ch, victim, dt ); + one_hit( ch, victim, dt, FALSE ); + + if (get_eq_char (ch, WEAR_SECONDARY)) + { + one_hit( ch, victim, dt, TRUE ); + if ( ch->fighting != victim ) + return; + } if (ch->fighting != victim) return; if (IS_AFFECTED(ch,AFF_HASTE)) - one_hit(ch,victim,dt); + one_hit(ch,victim,dt, FALSE); if ( ch->fighting != victim || dt == gsn_backstab ) return; @@ -241,7 +248,7 @@ if ( number_percent( ) < chance ) { - one_hit( ch, victim, dt ); + one_hit( ch, victim, dt, FALSE ); check_improve(ch,gsn_second_attack,TRUE,5); if ( ch->fighting != victim ) return; @@ -254,7 +261,7 @@ if ( number_percent( ) < chance ) { - one_hit( ch, victim, dt ); + one_hit( ch, victim, dt, FALSE ); check_improve(ch,gsn_third_attack,TRUE,6); if ( ch->fighting != victim ) return; @@ -269,7 +276,7 @@ int chance,number; CHAR_DATA *vch, *vch_next; - one_hit(ch,victim,dt); + one_hit(ch,victim,dt, FALSE); if (ch->fighting != victim) return; @@ -282,13 +289,13 @@ { vch_next = vch->next; if ((vch != victim && vch->fighting == ch)) - one_hit(ch,vch,dt); + one_hit(ch,vch,dt, FALSE); } } if (IS_AFFECTED(ch,AFF_HASTE) || (IS_SET(ch->off_flags,OFF_FAST) && !IS_AFFECTED(ch,AFF_SLOW))) - one_hit(ch,victim,dt); + one_hit(ch,victim,dt, FALSE); if (ch->fighting != victim || dt == gsn_backstab) return; @@ -300,7 +307,7 @@ if (number_percent() < chance) { - one_hit(ch,victim,dt); + one_hit(ch,victim,dt, FALSE); if (ch->fighting != victim) return; } @@ -312,7 +319,7 @@ if (number_percent() < chance) { - one_hit(ch,victim,dt); + one_hit(ch,victim,dt, FALSE); if (ch->fighting != victim) return; } @@ -399,7 +406,7 @@ /* * Hit one guy once. */ -void one_hit( CHAR_DATA *ch, CHAR_DATA *victim, int dt ) +void one_hit( CHAR_DATA *ch, CHAR_DATA *victim, int dt, bool secondary ) { OBJ_DATA *wield; int victim_ac; @@ -428,8 +435,12 @@ /* * Figure out the type of damage message. + * if secondary == true, use the second weapon. */ - wield = get_eq_char( ch, WEAR_WIELD ); + if (!secondary) + wield = get_eq_char( ch, WEAR_WIELD ); + else + wield = get_eq_char( ch, WEAR_SECONDARY ); if ( dt == TYPE_UNDEFINED ) { diff -ur ../rom2.4/src/interp.c src/interp.c --- ../rom2.4/src/interp.c Mon Oct 23 18:51:46 1995 +++ src/interp.c Sat Feb 3 23:44:51 1996 @@ -225,6 +225,7 @@ { "recite", do_recite, POS_RESTING, 0, LOG_NORMAL , 1 }, { "remove", do_remove, POS_RESTING, 0, LOG_NORMAL , 1 }, { "sell", do_sell, POS_RESTING, 0, LOG_NORMAL, 1 }, + { "second", do_second, POS_RESTING, 0, LOG_NORMAL , 1 }, { "take", do_get, POS_RESTING, 0, LOG_NORMAL, 1 }, { "sacrifice", do_sacrifice, POS_RESTING, 0, LOG_NORMAL, 1 }, { "junk", do_sacrifice, POS_RESTING, 0, LOG_NORMAL, 0 }, diff -ur ../rom2.4/src/interp.h src/interp.h --- ../rom2.4/src/interp.h Mon Oct 23 18:54:55 1995 +++ src/interp.h Sat Feb 3 23:45:12 1996 @@ -234,6 +234,7 @@ DECLARE_DO_FUN( do_say ); DECLARE_DO_FUN( do_score ); DECLARE_DO_FUN( do_scroll ); +DECLARE_DO_FUN( do_second ); DECLARE_DO_FUN( do_sell ); DECLARE_DO_FUN( do_set ); DECLARE_DO_FUN( do_shout ); diff -ur ../rom2.4/src/merc.h src/merc.h --- ../rom2.4/src/merc.h Mon Oct 23 18:56:23 1995 +++ src/merc.h Sat Feb 3 23:27:49 1996 @@ -1174,7 +1174,8 @@ #define WEAR_WIELD 16 #define WEAR_HOLD 17 #define WEAR_FLOAT 18 -#define MAX_WEAR 19 +#define WEAR_SECONDARY 19 +#define MAX_WEAR 20