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
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);
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 */
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))
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;
}