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:
nethack.rankin
2002-01-24 02:54:06 +00:00
parent 659f5be714
commit ef8f180fbc
2 changed files with 55 additions and 52 deletions

View File

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

View File

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