]> granicus.if.org Git - nethack/commitdiff
#force fixes
authornethack.rankin <nethack.rankin>
Sun, 18 Feb 2007 05:54:15 +0000 (05:54 +0000)
committernethack.rankin <nethack.rankin>
Sun, 18 Feb 2007 05:54:15 +0000 (05:54 +0000)
     Trunk and branch, noticed while working on an interface enhancement:
you could use #force to break the lock of a chest that's on the floor
while you're engulfed, also while levitating or mounted w/o riding skill.

     Trunk only:  refine an earlier fix that bills for breaking the lock
of a shop-owned chest.  The item which the hero is forced to buy showed
up in the bill as unlockable, which is accurate after the fact but didn't
reflect the shop's item.  Fix by billing for chest before altering it.

doc/fixes34.4
src/lock.c

index a000473c1ad65f0fadfd8d9712c20246bf0a49da..b5efe1e06c73b3271ad81851a62f2c47aa92f5c7 100644 (file)
@@ -323,6 +323,7 @@ hero's sleep resistance shouldn't protect steed from sleeping gas trap
 dropped wielded, in use leash should remain in inventory, since it's in-use
 wielded, in use leash can't be snatched by whip-wielding monster
 when using two weapons at once, whip-wielding monster can target either one
+can't #force floor item while engulfed, levitating, or unskilled riding
 
 
 Platform- and/or Interface-Specific Fixes
index b0e77eb6f4248998b730591bcb9df190799a542f..6b04f8f28a515835719bd2dbc9a8b7bb564efd76 100644 (file)
@@ -131,15 +131,15 @@ breakchestlock(box, destroyit)
 struct obj *box;
 boolean destroyit;
 {   
-    box->olocked = 0;
-    box->obroken = 1;
-    box->lknown = 1;
     if (!destroyit) {  /* bill for the box but not for its contents */
        struct obj *hide_contents = box->cobj;
 
        box->cobj = 0;
        costly_alteration(box, COST_BRKLCK);
        box->cobj = hide_contents;
+       box->olocked = 0;
+       box->obroken = 1;
+       box->lknown = 1;
     } else {           /* #force has destroyed this box (at <u.ux,u.uy>) */
        struct obj *otmp;
        struct monst *shkp = (*u.ushops && costly_spot(u.ux, u.uy)) ?
@@ -447,6 +447,10 @@ doforce()          /* try to force a chest with your weapon */
        register int c, picktyp;
        char qbuf[QBUFSZ];
 
+       if (u.uswallow) {
+           You_cant("force anything from inside here.");
+           return 0;
+       }
        if (!uwep ||    /* proper type test */
                ((uwep->oclass == WEAPON_CLASS || is_weptool(uwep)) ?
                    (objects[uwep->otyp].oc_skill < P_DAGGER ||
@@ -459,6 +463,10 @@ doforce()          /* try to force a chest with your weapon */
                         "without a proper" : "with that");
            return(0);
        }
+       if (!can_reach_floor(TRUE)) {
+           cant_reach_floor(u.ux, u.uy, FALSE, TRUE);
+           return 0;
+       }
 
        picktyp = is_blade(uwep) && !is_pick(uwep);
        if(xlock.usedtime && xlock.box && picktyp == xlock.picktyp) {