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
This commit is contained in:
PatR
2021-03-16 12:29:22 -07:00
parent c6e6d65e43
commit c3ccd93a88
3 changed files with 16 additions and 1 deletions

View File

@@ -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);

View File

@@ -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) {