From c3ccd93a88d88228c20997ae9e40906a8dd68733 Mon Sep 17 00:00:00 2001 From: PatR Date: Tue, 16 Mar 2021 12:29:22 -0700 Subject: [PATCH] fix pull request #469 - multiple '$' invent slots Assigning a partial stack of gold to quiver (Qnn$) resulted in an extra '$' slot in inventory, one for the unquivered part and another for the quivered part. Throwing a non-quivered partial stack of gold at self (tnn$.) also resulted in an extra '$' slot after throwing at self was rejected. For the first case, reject the quiver-subset-of-gold attempt. For both cases, recombine the two stacks back to original amount. Fixes #469 --- doc/fixes37.0 | 4 ++++ src/dothrow.c | 8 +++++++- src/wield.c | 5 +++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/doc/fixes37.0 b/doc/fixes37.0 index 61bf23a2f..c0271d18b 100644 --- a/doc/fixes37.0 +++ b/doc/fixes37.0 @@ -413,6 +413,10 @@ remove superfluous "All" from "All foos are already nonexistent." when blessed mounted hero falling out of saddle shouldn't hit ground and take damage when levitating or flying (if done without steed's help) avoid "obj not free" panic if monster kills itself by reading scroll of earth +attempting to throw a partial stack of gold at self was prevented but left + the partial stack in an extra $ inventory slot +quivering a partial stack of gold succeeded and put the partial stack in an + extra $ inventory slot Fixes to 3.7.0-x Problems that Were Exposed Via git Repository ------------------------------------------------------------------ diff --git a/src/dothrow.c b/src/dothrow.c index 8ded43e82..ef2ba9a0d 100644 --- a/src/dothrow.c +++ b/src/dothrow.c @@ -102,8 +102,9 @@ throw_obj(struct obj *obj, int shotlimit) if (obj->oclass == COIN_CLASS && obj != uquiver) return throw_gold(obj); - if (!canletgo(obj, "throw")) + if (!canletgo(obj, "throw")) { return 0; + } if (obj->oartifact == ART_MJOLLNIR && obj != uwep) { pline("%s must be wielded before it can be thrown.", The(xname(obj))); return 0; @@ -2160,6 +2161,11 @@ throw_gold(struct obj *obj) if (!u.dx && !u.dy && !u.dz) { You("cannot throw gold at yourself."); + /* If we tried to throw part of a stack, force it to merge back + together (same as in throw_obj). Essential for gold. */ + if (obj->o_id == g.context.objsplit.parent_oid + || obj->o_id == g.context.objsplit.child_oid) + (void) unsplitobj(obj); return 0; } freeinv(obj); diff --git a/src/wield.c b/src/wield.c index c907564e9..44bae5eac 100644 --- a/src/wield.c +++ b/src/wield.c @@ -499,6 +499,11 @@ dowieldquiver(void) if (uquiver && uquiver->o_id == g.context.objsplit.parent_oid) { unsplitobj(newquiver); goto already_quivered; + } else if (newquiver->oclass == COIN_CLASS) { + /* don't allow splitting a stack of coins into quiver */ + You("can't ready only part of your gold."); + unsplitobj(newquiver); + return 0; } finish_splitting = TRUE; } else if (newquiver == uquiver) { -- 2.50.0