diff --git a/doc/fixes34.1 b/doc/fixes34.1 index 4e3eb7503..d580cec63 100644 --- a/doc/fixes34.1 +++ b/doc/fixes34.1 @@ -362,6 +362,9 @@ engraving on headstone will appropriately dull your weapon certain types of golems should not "catch fire" so adjust the messages no longer need to manually examine inventory after regaining sight in order to give a type name to an object picked up while blind +when adding an object to inventory, it is possible for it to becomed both + wielded and quivered if it merges with weapon and autoquiver is enabled +include rocks as likely candidates for quivering if alternate weapon is a sling Platform- and/or Interface-Specific Fixes diff --git a/src/dothrow.c b/src/dothrow.c index 8520ffb95..b1ec8230e 100644 --- a/src/dothrow.c +++ b/src/dothrow.c @@ -1,4 +1,4 @@ -/* SCCS Id: @(#)dothrow.c 3.4 2003/01/08 */ +/* SCCS Id: @(#)dothrow.c 3.4 2003/01/24 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ @@ -215,7 +215,7 @@ dothrow() static void autoquiver() { - register struct obj *otmp, *oammo = 0, *omissile = 0, *omisc = 0; + struct obj *otmp, *oammo = 0, *omissile = 0, *omisc = 0, *altammo = 0; if (uquiver) return; @@ -233,6 +233,8 @@ autoquiver() objects[otmp->otyp].oc_material == GLASS)) { if (uslinging()) oammo = otmp; + else if (ammo_and_launcher(otmp, uswapwep)) + altammo = otmp; else if (!omisc) omisc = otmp; } else if (otmp->oclass == GEM_CLASS) { @@ -242,6 +244,8 @@ autoquiver() if (ammo_and_launcher(otmp, uwep)) /* Ammo matched with launcher (bow and arrow, crossbow and bolt) */ oammo = otmp; + else if (ammo_and_launcher(otmp, uswapwep)) + altammo = otmp; else /* Mismatched ammo (no better than an ordinary weapon) */ omisc = otmp; @@ -263,6 +267,8 @@ autoquiver() setuqwep(oammo); else if (omissile) setuqwep(omissile); + else if (altammo) + setuqwep(altammo); else if (omisc) setuqwep(omisc); diff --git a/src/invent.c b/src/invent.c index e1e965b0e..2ec4d433c 100644 --- a/src/invent.c +++ b/src/invent.c @@ -1,4 +1,4 @@ -/* SCCS Id: @(#)invent.c 3.4 2002/12/13 */ +/* SCCS Id: @(#)invent.c 3.4 2003/01/24 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ @@ -405,39 +405,35 @@ const char *drop_fmt, *drop_arg, *hold_msg; } } if (Fumbling) { - if (drop_fmt) pline(drop_fmt, drop_arg); - dropy(obj); + if (drop_fmt) pline(drop_fmt, drop_arg); + dropy(obj); } else { - long oquan = obj->quan; - int prev_encumbr = near_capacity(); /* before addinv() */ + long oquan = obj->quan; + int prev_encumbr = near_capacity(); /* before addinv() */ - /* encumbrance only matters if it would now become worse - than max( current_value, stressed ) */ - if (prev_encumbr < MOD_ENCUMBER) prev_encumbr = MOD_ENCUMBER; - if (drop_arg) { - /* addinv() may redraw the entire inventory, overwriting - * drop_arg when it comes from something like doname() - */ - Strcpy(buf, drop_arg); - drop_arg = buf; - } - obj = addinv(obj); - if (inv_cnt() > 52 + /* encumbrance only matters if it would now become worse + than max( current_value, stressed ) */ + if (prev_encumbr < MOD_ENCUMBER) prev_encumbr = MOD_ENCUMBER; + /* addinv() may redraw the entire inventory, overwriting + drop_arg when it comes from something like doname() */ + if (drop_arg) drop_arg = strcpy(buf, drop_arg); + + obj = addinv(obj); + if (inv_cnt() > 52 || ((obj->otyp != LOADSTONE || !obj->cursed) && near_capacity() > prev_encumbr)) { - if (drop_fmt) pline(drop_fmt, drop_arg); - /* undo any merge which took place */ - if (obj->quan > oquan) { - obj = splitobj(obj, oquan); - } - dropx(obj); - } else { - if (flags.autoquiver && !uquiver && - (is_missile(obj) || - (uwep && ammo_and_launcher(obj, uwep)))) - setuqwep(obj); - if (hold_msg || drop_fmt) prinv(hold_msg, obj, oquan); - } + if (drop_fmt) pline(drop_fmt, drop_arg); + /* undo any merge which took place */ + if (obj->quan > oquan) obj = splitobj(obj, oquan); + dropx(obj); + } else { + if (flags.autoquiver && !uquiver && !obj->owornmask && + (is_missile(obj) || + ammo_and_launcher(obj, uwep) || + ammo_and_launcher(obj, uswapwep))) + setuqwep(obj); + if (hold_msg || drop_fmt) prinv(hold_msg, obj, oquan); + } } return obj; } diff --git a/src/wield.c b/src/wield.c index 70ddeaf16..92e84cf91 100644 --- a/src/wield.c +++ b/src/wield.c @@ -331,18 +331,20 @@ int dowieldquiver() { register struct obj *newquiver; - + const char *quivee_types = (uslinging() || + (uswapwep && objects[uswapwep->otyp].oc_skill == P_SLING)) ? + bullets : ready_objs; /* Since the quiver isn't in your hands, don't check cantwield(), */ /* will_weld(), touch_petrifies(), etc. */ multi = 0; /* Because 'Q' used to be quit... */ - if (!flags.suppress_alert || flags.suppress_alert < FEATURE_NOTICE_VER(3,3,0)) + if (flags.suppress_alert < FEATURE_NOTICE_VER(3,3,0)) pline("Note: Please use #quit if you wish to exit the game."); /* Prompt for a new quiver */ - if (!(newquiver = getobj(uslinging() ? bullets : ready_objs, "ready"))) + if (!(newquiver = getobj(quivee_types, "ready"))) /* Cancelled */ return (0);