more GOLDOBJ
The earlier patch made sure that bribe() didn't pass an invalid value to money2mon(). This one changes money2mon() so that if some other code else does so, reporting the impossible situation won't be followed by a splitobj panic. Most of this patch is reformatting though.
This commit is contained in:
14
src/minion.c
14
src/minion.c
@@ -186,19 +186,19 @@ struct monst *mtmp;
|
|||||||
} else if (offer >= u.ugold) {
|
} else if (offer >= u.ugold) {
|
||||||
You("give %s all your gold.", mon_nam(mtmp));
|
You("give %s all your gold.", mon_nam(mtmp));
|
||||||
offer = u.ugold;
|
offer = u.ugold;
|
||||||
} else You("give %s %ld %s.", mon_nam(mtmp), offer,
|
} else {
|
||||||
currency(offer));
|
You("give %s %ld %s.", mon_nam(mtmp), offer, currency(offer));
|
||||||
|
}
|
||||||
u.ugold -= offer;
|
u.ugold -= offer;
|
||||||
mtmp->mgold += offer;
|
mtmp->mgold += offer;
|
||||||
#else
|
#else
|
||||||
} else if (offer >= umoney) {
|
} else if (offer >= umoney) {
|
||||||
You("give %s all your gold.", mon_nam(mtmp));
|
You("give %s all your gold.", mon_nam(mtmp));
|
||||||
offer = umoney;
|
offer = umoney;
|
||||||
} else You("give %s %ld %s.", mon_nam(mtmp), offer,
|
} else {
|
||||||
currency(offer));
|
You("give %s %ld %s.", mon_nam(mtmp), offer, currency(offer));
|
||||||
|
}
|
||||||
money2mon(mtmp, offer);
|
(void) money2mon(mtmp, offer);
|
||||||
#endif
|
#endif
|
||||||
flags.botl = 1;
|
flags.botl = 1;
|
||||||
return(offer);
|
return(offer);
|
||||||
|
|||||||
93
src/shk.c
93
src/shk.c
@@ -76,38 +76,39 @@ static void FDECL(rob_shop, (struct monst *));
|
|||||||
|
|
||||||
#ifdef GOLDOBJ
|
#ifdef GOLDOBJ
|
||||||
/*
|
/*
|
||||||
Transfer money from inventory to monster when paying
|
Transfer money from inventory to monster when paying
|
||||||
shopkeepers, priests, oracle, succubus, & other demons.
|
shopkeepers, priests, oracle, succubus, & other demons.
|
||||||
Simple qith only gold coins.
|
Simple qith only gold coins.
|
||||||
This routine will handle money changing when multiple
|
This routine will handle money changing when multiple
|
||||||
coin types is implemented, only appropriate
|
coin types is implemented, only appropriate
|
||||||
monsters will pay change. (Peaceful shopkeepers, priests
|
monsters will pay change. (Peaceful shopkeepers, priests
|
||||||
& the oracle try to maintain goodwill while selling
|
& the oracle try to maintain goodwill while selling
|
||||||
their wares or services. Angry monsters and all demons
|
their wares or services. Angry monsters and all demons
|
||||||
will keep anything they get their hands on.
|
will keep anything they get their hands on.
|
||||||
Returns the amount actually paid, so we can know
|
Returns the amount actually paid, so we can know
|
||||||
if the monster kept the change.
|
if the monster kept the change.
|
||||||
*/
|
*/
|
||||||
long money2mon(mon, amount)
|
long money2mon(mon, amount)
|
||||||
struct monst *mon;
|
struct monst *mon;
|
||||||
long amount;
|
long amount;
|
||||||
{
|
{
|
||||||
struct obj *ygold = findgold(invent);
|
struct obj *ygold = findgold(invent);
|
||||||
|
|
||||||
if (ygold && ygold == uquiver) uqwepgone();
|
if (amount <= 0) {
|
||||||
|
impossible("%s payment in money2mon!", amount ? "negative" : "zero");
|
||||||
|
return 0L;
|
||||||
|
}
|
||||||
|
if (!ygold || ygold->quan < amount) {
|
||||||
|
impossible("Paying without %s money?", ygold ? "enough" : "");
|
||||||
|
return 0L;
|
||||||
|
}
|
||||||
|
|
||||||
if (amount <= 0) impossible("%s payment in money2mon!",
|
if (ygold->quan > amount) ygold = splitobj(ygold, amount);
|
||||||
amount ? "negative" : "zero");
|
else if (ygold->owornmask) remove_worn_item(ygold); /* quiver */
|
||||||
if (!ygold || ygold->quan < amount) {
|
freeinv(ygold);
|
||||||
impossible("Paying without %s money?", ygold ? "enough" : "");
|
add_to_minv(mon, ygold);
|
||||||
return 0;
|
flags.botl = 1;
|
||||||
}
|
return amount;
|
||||||
|
|
||||||
if (ygold->quan > amount) ygold = splitobj(ygold, amount);
|
|
||||||
freeinv(ygold);
|
|
||||||
add_to_minv(mon, ygold);
|
|
||||||
flags.botl = 1;
|
|
||||||
return amount;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -115,32 +116,34 @@ long amount;
|
|||||||
Transfer money from monster to inventory.
|
Transfer money from monster to inventory.
|
||||||
Used when the shopkeeper pay for items, and when
|
Used when the shopkeeper pay for items, and when
|
||||||
the priest gives you money for an ale.
|
the priest gives you money for an ale.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
money2u(mon, amount)
|
money2u(mon, amount)
|
||||||
struct monst *mon;
|
struct monst *mon;
|
||||||
long amount;
|
long amount;
|
||||||
{
|
{
|
||||||
struct obj *mongold = findgold(mon->minvent);
|
struct obj *mongold = findgold(mon->minvent);
|
||||||
|
|
||||||
if (amount <= 0) impossible("%s payment in money2u!",
|
if (amount <= 0) {
|
||||||
amount ? "negative" : "zero");
|
impossible("%s payment in money2u!", amount ? "negative" : "zero");
|
||||||
if (!mongold || mongold->quan < amount) {
|
return;
|
||||||
impossible("%s paying without %s money?", a_monnam(mon),
|
}
|
||||||
mongold ? "enough" : "");
|
if (!mongold || mongold->quan < amount) {
|
||||||
return;
|
impossible("%s paying without %s money?", a_monnam(mon),
|
||||||
}
|
mongold ? "enough" : "");
|
||||||
|
return;
|
||||||
if (mongold->quan > amount) mongold = splitobj(mongold, amount);
|
}
|
||||||
obj_extract_self(mongold);
|
|
||||||
|
|
||||||
if (!merge_choice(invent, mongold) && inv_cnt() >= 52) {
|
if (mongold->quan > amount) mongold = splitobj(mongold, amount);
|
||||||
You("have no room for the money!");
|
obj_extract_self(mongold);
|
||||||
dropy(mongold);
|
|
||||||
} else {
|
if (!merge_choice(invent, mongold) && inv_cnt() >= 52) {
|
||||||
addinv(mongold);
|
You("have no room for the money!");
|
||||||
flags.botl = 1;
|
dropy(mongold);
|
||||||
}
|
} else {
|
||||||
|
addinv(mongold);
|
||||||
|
flags.botl = 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* GOLDOBJ */
|
#endif /* GOLDOBJ */
|
||||||
|
|||||||
Reference in New Issue
Block a user