From 39117162977acb4fbe5d678b84df76fd752c165e Mon Sep 17 00:00:00 2001 From: "nethack.rankin" Date: Sun, 29 Oct 2006 04:10:55 +0000 Subject: [PATCH] shop queries (trunk only) This eliminates a whole bunch of the "Query truncated" entries in the nethack.alt.org paniclog file by using safe_qbuf() where applicable. It also makes selling queries and some other shop messages be less verbose when shopkeepers are invisible (not uncommon after characters achieve see invisible capability) by using shkname() to get "Manlobbi" instead of Monnam()'s "Manlobbi the invisible shopkeeper" (something I had planned to do even before seeing the truncations in that paniclog; repetition of "the invisible shopkeeper" was very annoying when stepping through multiple unpaid objects with itemized billing). This also simplifies several GOLDOBJ conditional sections which happened to be near the other code I was modifying. --- doc/fixes35.0 | 1 + src/shk.c | 178 ++++++++++++++++++++++---------------------------- 2 files changed, 79 insertions(+), 100 deletions(-) diff --git a/doc/fixes35.0 b/doc/fixes35.0 index 5c7441d92..417a7d424 100644 --- a/doc/fixes35.0 +++ b/doc/fixes35.0 @@ -165,6 +165,7 @@ getting a particular rotten food result can't make attempting to eat a pad shortest rumors to improve distribution of delivered rumors wake up sleeping steed when putting on saddle or mounting stop wielding cockatrice corpse which triggered own death followed by life-save +format various prompts to avoid "Query truncated" entries in paniclog Platform- and/or Interface-Specific Fixes diff --git a/src/shk.c b/src/shk.c index 55a1ce8c5..39811df95 100644 --- a/src/shk.c +++ b/src/shk.c @@ -1066,9 +1066,7 @@ dopay() register struct monst *shkp; struct monst *nxtm, *resident; long ltmp; -#ifdef GOLDOBJ long umoney; -#endif int pass, tmp, sk = 0, seensk = 0; boolean paid = FALSE, stashed_gold = (hidden_gold() > 0L); @@ -1177,43 +1175,28 @@ proceed: if(shkp != resident && NOTANGRY(shkp)) { #ifdef GOLDOBJ - umoney = money_cnt(invent); + umoney = money_cnt(invent); +#else + umoney = u.ugold; #endif if(!ltmp) You("do not owe %s anything.", mon_nam(shkp)); -#ifndef GOLDOBJ - else if(!u.ugold) { -#else else if(!umoney) { -#endif You("%shave no money.", stashed_gold ? "seem to " : ""); if(stashed_gold) pline("But you have some gold stashed away."); } else { -#ifndef GOLDOBJ - long ugold = u.ugold; - if(ugold > ltmp) { -#else if(umoney > ltmp) { -#endif You("give %s the %ld gold piece%s %s asked for.", - mon_nam(shkp), ltmp, plur(ltmp), mhe(shkp)); + shkname(shkp), ltmp, plur(ltmp), mhe(shkp)); pay(ltmp, shkp); } else { - You("give %s all your%s gold.", mon_nam(shkp), - stashed_gold ? " openly kept" : ""); -#ifndef GOLDOBJ - pay(u.ugold, shkp); -#else + You("give %s all your%s gold.", shkname(shkp), + stashed_gold ? " openly kept" : ""); pay(umoney, shkp); -#endif if (stashed_gold) pline("But you have hidden gold!"); } -#ifndef GOLDOBJ - if((ugold < ltmp/2L) || (ugold < ltmp && stashed_gold)) -#else if((umoney < ltmp/2L) || (umoney < ltmp && stashed_gold)) -#endif pline("Unfortunately, %s doesn't look satisfied.", mhe(shkp)); else @@ -1225,27 +1208,19 @@ proceed: /* ltmp is still eshkp->robbed here */ if (!eshkp->billct && !eshkp->debit) { #ifdef GOLDOBJ - umoney = money_cnt(invent); + umoney = money_cnt(invent); +#else + umoney = u.ugold; #endif if(!ltmp && NOTANGRY(shkp)) { - You("do not owe %s anything.", mon_nam(shkp)); -#ifndef GOLDOBJ - if (!u.ugold) -#else + You("do not owe %s anything.", shkname(shkp)); if (!umoney) -#endif pline(no_money, stashed_gold ? " seem to" : ""); } else if(ltmp) { - pline("%s is after blood, not money!", Monnam(shkp)); -#ifndef GOLDOBJ - if(u.ugold < ltmp/2L || - (u.ugold < ltmp && stashed_gold)) { - if (!u.ugold) -#else + pline("%s is after blood, not money!", shkname(shkp)); if(umoney < ltmp/2L || (umoney < ltmp && stashed_gold)) { if (!umoney) -#endif pline(no_money, stashed_gold ? " seem to" : ""); else pline(not_enough_money, mhim(shkp)); return(1); @@ -1253,31 +1228,17 @@ proceed: pline("But since %s shop has been robbed recently,", mhis(shkp)); pline("you %scompensate %s for %s losses.", -#ifndef GOLDOBJ - (u.ugold < ltmp) ? -#else - (umoney < ltmp) ? -#endif - "partially " : "", - mon_nam(shkp), mhis(shkp)); -#ifndef GOLDOBJ - pay(u.ugold < ltmp ? u.ugold : ltmp, shkp); -#else + (umoney < ltmp) ? "partially " : "", + shkname(shkp), mhis(shkp)); pay(umoney < ltmp ? umoney : ltmp, shkp); -#endif make_happy_shk(shkp, FALSE); } else { /* shopkeeper is angry, but has not been robbed -- * door broken, attacked, etc. */ pline("%s is after your hide, not your money!", Monnam(shkp)); -#ifndef GOLDOBJ - if(u.ugold < 1000L) { - if (!u.ugold) -#else if(umoney < 1000L) { if (!umoney) -#endif pline(no_money, stashed_gold ? " seem to" : ""); else pline(not_enough_money, mhim(shkp)); return(1); @@ -1289,7 +1250,7 @@ proceed: if (strncmp(eshkp->customer, plname, PL_NSIZ) || rn2(3)) make_happy_shk(shkp, FALSE); else - pline("But %s is as angry as ever.", mon_nam(shkp)); + pline("But %s is as angry as ever.", shkname(shkp)); } return(1); } @@ -1463,6 +1424,8 @@ boolean itemize; long ltmp, quan, save_quan; #ifdef GOLDOBJ long umoney = money_cnt(invent); +#else + long umoney = u.ugold; #endif int buy; boolean stashed_gold = (hidden_gold() > 0L), @@ -1472,11 +1435,7 @@ boolean itemize; impossible("Paid object on bill??"); return PAY_BUY; } -#ifndef GOLDOBJ - if(itemize && u.ugold + ESHK(shkp)->credit == 0L){ -#else if(itemize && umoney + ESHK(shkp)->credit == 0L){ -#endif You("%shave no money or credit left.", stashed_gold ? "seem to " : ""); return PAY_BROKE; @@ -1499,28 +1458,28 @@ boolean itemize; buy = PAY_BUY; /* flag; if changed then return early */ if (itemize) { - char qbuf[BUFSZ]; - Sprintf(qbuf,"%s for %ld %s. Pay?", quan == 1L ? - Doname2(obj) : doname(obj), ltmp, currency(ltmp)); + char qbuf[BUFSZ], qsfx[BUFSZ]; + + Sprintf(qsfx, " for %ld %s. Pay?", ltmp, currency(ltmp)); + (void)safe_qbuf(qbuf, (char *)0, qsfx, + obj, (quan == 1L) ? Doname2 : doname, + ansimpleoname, (quan == 1L) ? "that" : "those"); if (yn(qbuf) == 'n') { buy = PAY_SKIP; /* don't want to buy */ } else if (quan < bp->bquan && !consumed) { /* partly used goods */ obj->quan = bp->bquan - save_quan; /* used up amount */ verbalize("%s for the other %s before buying %s.", - ANGRY(shkp) ? "Pay" : "Please pay", xname(obj), + ANGRY(shkp) ? "Pay" : "Please pay", + simpleonames(obj), /* short name suffices */ save_quan > 1L ? "these" : "this one"); buy = PAY_SKIP; /* shk won't sell */ } } -#ifndef GOLDOBJ - if (buy == PAY_BUY && u.ugold + ESHK(shkp)->credit < ltmp) { -#else if (buy == PAY_BUY && umoney + ESHK(shkp)->credit < ltmp) { -#endif You("don't%s have gold%s enough to pay for %s.", stashed_gold ? " seem to" : "", (ESHK(shkp)->credit > 0L) ? " or credit" : "", - doname(obj)); + thesimpleoname(obj)); buy = itemize ? PAY_SKIP : PAY_CANT; } @@ -2568,7 +2527,7 @@ xchar x, y; { register struct monst *shkp; register struct eshk *eshkp; - long ltmp = 0L, cltmp = 0L, gltmp = 0L, offer; + long ltmp = 0L, cltmp = 0L, gltmp = 0L, offer, shkmoney; boolean saleitem, cgold = FALSE, container = Has_contents(obj); boolean isgold = (obj->oclass == COIN_CLASS); boolean only_partially_your_contents = FALSE; @@ -2597,9 +2556,8 @@ xchar x, y; offer = ltmp + cltmp; /* get one case out of the way: nothing to sell, and no gold */ - if(!isgold && - ((offer + gltmp) == 0L || sell_how == SELL_DONTSELL)) { - register boolean unpaid = (obj->unpaid || + if (!isgold && ((offer + gltmp) == 0L || sell_how == SELL_DONTSELL)) { + boolean unpaid = (obj->unpaid || (container && count_unpaid(obj->cobj))); if(container) { @@ -2691,24 +2649,23 @@ move_on: } #ifndef GOLDOBJ - if(!shkp->mgold) { + shkmoney = shkp->mgold; #else - if(!money_cnt(shkp->minvent)) { + shkmoney = money_cnt(shkp->minvent); #endif + if (!shkmoney) { char c, qbuf[BUFSZ]; long tmpcr = ((offer * 9L) / 10L) + (offer <= 1L); if (sell_how == SELL_NORMAL || auto_credit) { c = sell_response = 'y'; } else if (sell_response != 'n') { - pline("%s cannot pay you at present.", Monnam(shkp)); - Sprintf(qbuf, - "Will you accept %ld %s in credit for %s?", - tmpcr, currency(tmpcr), doname(obj)); - /* won't accept 'a' response here */ - /* KLY - 3/2000 yes, we will, it's a damn nuisance - to have to constantly hit 'y' to sell for credit */ - c = ynaq(qbuf); + pline("%s cannot pay you at present.", shkname(shkp)); + Sprintf(qbuf, "Will you accept %ld %s in credit for ", + tmpcr, currency(tmpcr)); + c = ynaq(safe_qbuf(qbuf, qbuf, "?", + obj, doname, thesimpleoname, + (obj->quan == 1L) ? "that" : "those")); if (c == 'a') { c = 'y'; auto_credit = TRUE; @@ -2732,29 +2689,50 @@ move_on: subfrombill(obj, shkp); } } else { - char qbuf[BUFSZ]; -#ifndef GOLDOBJ - boolean short_funds = (offer > shkp->mgold); - if (short_funds) offer = shkp->mgold; -#else - long shkmoney = money_cnt(shkp->minvent); - boolean short_funds = (offer > shkmoney); + char qbuf[BUFSZ], qsfx[BUFSZ]; + boolean short_funds = (offer > shkmoney), one; + if (short_funds) offer = shkmoney; -#endif if (!sell_response) { - only_partially_your_contents = - (contained_cost(obj, shkp, 0L, FALSE, FALSE) != - contained_cost(obj, shkp, 0L, FALSE, TRUE)); - Sprintf(qbuf, - "%s offers%s %ld gold piece%s for%s %s %s. Sell %s?", - Monnam(shkp), short_funds ? " only" : "", + only_partially_your_contents = (container && + contained_cost(obj, shkp, 0L, FALSE, FALSE) != + contained_cost(obj, shkp, 0L, FALSE, TRUE)); + /* + " offers * for ..." query formatting. + Normal item(s): + "... your . Sell it?" + "... your . Sell them?" + A container is either owned by the hero, or already + owned by the shk (!ltmp), or the shk isn't interested + in buying it (also !ltmp). It's either empty (!cltmp) + or it has contents owned by the hero or it has some + contents owned by the hero and others by the shk. + (The case where it has contents already entirely owned + by the shk is treated the same was if it were empty + since the hero isn't selling any of those contents.) + Your container: + "... your . Sell it?" + "... your and its contents. Sell them?" + "... your and items inside. Sell them?" + Shk's container: + (empty case won't happen--nothing to sell) + "... the contents of the . Sell them?" + "... your items in the . Sell them?" + */ + Sprintf(qbuf, "%s offers%s %ld gold piece%s for%s %s ", + shkname(shkp), short_funds ? " only" : "", offer, plur(offer), - (!ltmp && cltmp && only_partially_your_contents) ? - " your items in" : (!ltmp && cltmp) ? " the contents of" : "", - obj->unpaid ? "the" : "your", cxname(obj), - (obj->quan == 1L && - !(!ltmp && cltmp && only_partially_your_contents)) ? - "it" : "them"); + (cltmp && !ltmp) ? (only_partially_your_contents ? + " your items in" : " the contents of") : "", + obj->unpaid ? "the" : "your"); + one = (obj->quan == 1L && !cltmp); + Sprintf(qsfx, "%s. Sell %s?", + (cltmp && ltmp) ? (only_partially_your_contents ? + " and items inside" : " and its contents") : "", + one ? "it" : "them"); + (void)safe_qbuf(qbuf, qbuf, qsfx, + obj, xname, simpleonames, + one ? "that" : "those"); } else qbuf[0] = '\0'; /* just to pacify lint */ switch (sell_response ? sell_response : ynaq(qbuf)) {