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

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

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