From: Pasi Kallinen Date: Wed, 16 Feb 2022 06:49:12 +0000 (+0200) Subject: Looting will fall through to force X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d958d032a06618ff6d3657a69c79c4daefac68fa;p=nethack Looting will fall through to force If you have autounlock on, and don't have unlocking tool, but are wielding a weapon usable for forcing the lock. --- diff --git a/doc/fixes3-7-0.txt b/doc/fixes3-7-0.txt index d39c13dea..95dacd28b 100644 --- a/doc/fixes3-7-0.txt +++ b/doc/fixes3-7-0.txt @@ -778,6 +778,8 @@ monsters should growl even if you can't hear it give a sound effect message when thrown item lands in water or lava don't show rusting of items that land in water the water used on the Plane of Water stops thrown or kicked items +looting will do #force if you could do it and the container is locked + and you didn't have a tool to unlock it Fixes to 3.7.0-x Problems that Were Exposed Via git Repository diff --git a/include/extern.h b/include/extern.h index b2cbef141..75c8c92a7 100644 --- a/include/extern.h +++ b/include/extern.h @@ -1178,6 +1178,7 @@ extern void reset_pick(void); extern void maybe_reset_pick(struct obj *); extern struct obj *autokey(boolean); extern int pick_lock(struct obj *, xchar, xchar, struct obj *); +extern boolean u_have_forceable_weapon(void); extern int doforce(void); extern boolean boxlock(struct obj *, struct obj *); extern boolean doorlock(struct obj *, int, int); diff --git a/src/lock.c b/src/lock.c index 6d3f73037..123aeb991 100644 --- a/src/lock.c +++ b/src/lock.c @@ -602,6 +602,20 @@ pick_lock(struct obj *pick, return PICKLOCK_DID_SOMETHING; } +/* is hero wielding a weapon that can #force? */ +boolean +u_have_forceable_weapon(void) +{ + if (!uwep /* proper type test */ + || ((uwep->oclass == WEAPON_CLASS || is_weptool(uwep)) + ? (objects[uwep->otyp].oc_skill < P_DAGGER + || objects[uwep->otyp].oc_skill == P_FLAIL + || objects[uwep->otyp].oc_skill > P_LANCE) + : uwep->oclass != ROCK_CLASS)) + return FALSE; + return TRUE; +} + RESTORE_WARNING_FORMAT_NONLITERAL /* the #force command - try to force a chest with your weapon */ @@ -616,12 +630,7 @@ doforce(void) You_cant("force anything from inside here."); return ECMD_OK; } - if (!uwep /* proper type test */ - || ((uwep->oclass == WEAPON_CLASS || is_weptool(uwep)) - ? (objects[uwep->otyp].oc_skill < P_DAGGER - || objects[uwep->otyp].oc_skill == P_FLAIL - || objects[uwep->otyp].oc_skill > P_LANCE) - : uwep->oclass != ROCK_CLASS)) { + if (!u_have_forceable_weapon()) { You_cant("force anything %s weapon.", !uwep ? "when not wielding a" : (uwep->oclass != WEAPON_CLASS && !is_weptool(uwep)) diff --git a/src/pickup.c b/src/pickup.c index cb4f0f180..5d37b04da 100644 --- a/src/pickup.c +++ b/src/pickup.c @@ -1877,9 +1877,15 @@ do_loot_cont(struct obj **cobjp, pline("Hmmm, %s turns out to be locked.", the(xname(cobj))); cobj->lknown = 1; - if (flags.autounlock && (unlocktool = autokey(TRUE)) != 0) { - /* pass ox and oy to avoid direction prompt */ - return (pick_lock(unlocktool, cobj->ox, cobj->oy, cobj) != 0); + if (flags.autounlock) { + if ((unlocktool = autokey(TRUE)) != 0) { + /* pass ox and oy to avoid direction prompt */ + return (pick_lock(unlocktool, cobj->ox, cobj->oy, cobj) != 0); + } else if (ccount == 1 && u_have_forceable_weapon()) { + /* single container, and we could #force it open... */ + cmdq_add_ec(doforce); /* doforce asks for confirmation */ + g.abort_looting = TRUE; + } } return ECMD_OK; }