]> granicus.if.org Git - nethack/commitdiff
Looting will fall through to force
authorPasi Kallinen <paxed@alt.org>
Wed, 16 Feb 2022 06:49:12 +0000 (08:49 +0200)
committerPasi Kallinen <paxed@alt.org>
Wed, 16 Feb 2022 06:49:16 +0000 (08:49 +0200)
If you have autounlock on, and don't have unlocking tool, but
are wielding a weapon usable for forcing the lock.

doc/fixes3-7-0.txt
include/extern.h
src/lock.c
src/pickup.c

index d39c13dea12f75876466bc573610596b456f96c7..95dacd28bd2ad289f09d1029c92d7e8e65f00384 100644 (file)
@@ -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
index b2cbef141698e53be36b1d37995c058edc017f74..75c8c92a72b59278c9b4ac8f62b37091e0d1fdce 100644 (file)
@@ -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);
index 6d3f730377420e834d71c5c741b8bb9f47790f05..123aeb991d24412578f93c8fe793993ec5006a26 100644 (file)
@@ -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))
index cb4f0f18049cd1c336c8e53d53376d3f17b94a15..5d37b04da62977aad73aaa551f3f632afb696b53 100644 (file)
@@ -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;
     }