Skip to content

Commit

Permalink
fix #2236 - bag of holding weight
Browse files Browse the repository at this point in the history
     From a bug report, the weight of a non-cursed bag
of holding would be off by 1 when the weight of contents was a multiple
of 2 (for uncursed) or of 4 (for blessed), since the round off handling
added 1 when it shouldn't in those cases.  Mainly noticeable when empty;
the extra 1 unit made it be twice as heavy as it should have been.

     Probably never noticed in actual play.  He has implemented a patch
which shows weights as part of an object's formatted description, making
this stand out.  Supposedly the Vulture's Eye interface also added a
patch like that a farily long time ago; I wonder why nobody using it ever
noticed.  (Maybe the weight was suppressed for bags of holding there?)
  • Loading branch information
nethack.rankin committed Apr 9, 2011
1 parent 6df18e2 commit 3e44a5f
Show file tree
Hide file tree
Showing 3 changed files with 6 additions and 9 deletions.
1 change: 1 addition & 0 deletions doc/fixes34.4
Original file line number Diff line number Diff line change
Expand Up @@ -401,6 +401,7 @@ some actions taken when blind would yield "Wait! That's a monster!" (for a
when polymorphed into an opposite sex monster, if you then become a new
human while failing to polymorph into something else, you'd be told
"you feel like a new man" for female or "a new woman" for male
the weight of a non-cursed bag of holding was sometimes off by 1 unit


Platform- and/or Interface-Specific Fixes
Expand Down
12 changes: 4 additions & 8 deletions src/mkobj.c
Original file line number Diff line number Diff line change
Expand Up @@ -1169,20 +1169,16 @@ register struct obj *obj;
* Bag status Weight of contents
* ---------- ------------------
* cursed 2x
* blessed x/4 + 1
* otherwise x/2 + 1
* blessed x/4 [rounded up: (x+3)/4]
* otherwise x/2 [rounded up: (x+1)/2]
*
* The macro DELTA_CWT in pickup.c also implements these
* weight equations.
*
* Note: The above checks are performed in the given order.
* this means that if an object is both blessed and
* cursed (not supposed to happen), it will be treated
* as cursed.
*/
if (obj->otyp == BAG_OF_HOLDING)
cwt = obj->cursed ? (cwt * 2) :
(1 + (cwt / (obj->blessed ? 4 : 2)));
obj->blessed ? ((cwt + 3) / 4) :
((cwt + 1) / 2);

return wt + cwt;
}
Expand Down
2 changes: 1 addition & 1 deletion src/pickup.c
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ STATIC_DCL void FDECL(tipcontainer, (struct obj *));
*/
#define DELTA_CWT(cont,obj) \
((cont)->cursed ? (obj)->owt * 2 : \
1 + ((obj)->owt / ((cont)->blessed ? 4 : 2)))
(cont)->blessed ? ((obj)->owt + 3) / 4 : ((obj)->owt + 1) / 2)
#define GOLD_WT(n) (((n) + 50L) / 100L)
/* if you can figure this out, give yourself a hearty pat on the back... */
#define GOLD_CAPACITY(w,n) (((w) * -100L) - ((n) + 50L) - 1L)
Expand Down

0 comments on commit 3e44a5f

Please sign in to comment.