diff --git a/dat/opthelp b/dat/opthelp index f059ddabc..31a216c3f 100644 --- a/dat/opthelp +++ b/dat/opthelp @@ -118,6 +118,9 @@ pickup_burden when you pick up an item that exceeds this encumberance or overLoaded), you will be asked if you want to continue. [S] pickup_types a list of default symbols for kinds of objects to autopickup when that option is on [all] +pile_limit for feedback when walking across floor objects, threshold at + which "there are many objects here" is displayed instead of + listing the objects. (0 means "always list objects.") [5] runmode controls how often the map window is updated when performing multi-step movement (various running modes or travel command): teleport -- don't update map until movement stops; diff --git a/doc/Guidebook.mn b/doc/Guidebook.mn index 184a5e5b6..f57a04298 100644 --- a/doc/Guidebook.mn +++ b/doc/Guidebook.mn @@ -1983,6 +1983,13 @@ compile time option AUTOPICKUP_EXCEPTIONS included, you may be able to use configuration file lines to further refine .op autopickup behavior. +.lp pile_limit +When walking across a pile of objects on the floor, threshold at which +the message "there are few/several/many objects here" is given instead +of showing a popup list of those objects. A value of 0 means "no limit" +(always list the objects); a value of 1 effectively means "never show +the objects" since the pile size will always be at least that big; +default value is 5. .lp playmode Values are `normal', `explore', or `debug'. Allows selection of explore mode (also known as discovery mode) or debug diff --git a/doc/Guidebook.tex b/doc/Guidebook.tex index ba103e8b0..77728b772 100644 --- a/doc/Guidebook.tex +++ b/doc/Guidebook.tex @@ -31,7 +31,7 @@ \begin{document} % % input file: guidebook.mn -% $Revision: 1.103 $ $Date: 2007/02/15 05:22:32 $ +% $Revision: 1.104 $ $Date: 2007/02/18 04:49:19 $ % %.ds h0 " %.ds h1 %.ds h2 \% @@ -2457,6 +2457,14 @@ compile time option AUTOPICKUP\_EXCEPTIONS included, you may be able to use ``{\it autopickup\_exception\/}'' configuration file lines to further refine ``{\it autopickup\/}'' behavior. %.lp +\item[\ib{pile\_limit}] +When walking across a pile of objects on the floor, threshold at which +the message ``there are few/several/many objects here'' is given instead +of showing a popup list of those objects. A value of 0 means ``no limit'' +(always list the objects); a value of 1 effectively means ``never show +the objects'' since the pile size will always be at least that big; +default value is 5. +%.lp \item[\ib{playmode}] Values are {\it normal\/}, {\it explore\/}, or {\it debug\/}. Allows selection of explore mode (also known as discovery mode) or debug diff --git a/doc/fixes35.0 b/doc/fixes35.0 index 73e810599..45c359d4d 100644 --- a/doc/fixes35.0 +++ b/doc/fixes35.0 @@ -323,6 +323,8 @@ player can give a monster class when asked for type of monster to poly into likewise when asked about type for #monpolycontrol scroll of taming/spell of charm monster now gives some feedback doppelgangers can take on the shape of alternate roles' quest guardians +pile_limit option to control when to switch to "there are objects here" + vs listing objects on floor when hero goes over objects while moving Platform- and/or Interface-Specific New Features diff --git a/include/flag.h b/include/flag.h index 76fc0c5ce..c4acdad4e 100644 --- a/include/flag.h +++ b/include/flag.h @@ -1,4 +1,4 @@ -/* SCCS Id: @(#)flag.h 3.5 2007/02/16 */ +/* SCCS Id: @(#)flag.h 3.5 2007/04/26 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ @@ -59,6 +59,7 @@ struct flag { #define NEW_MOON 0 #define FULL_MOON 4 int pickup_burden; /* maximum burden before prompt */ + int pile_limit; /* controls feedback when walking over objects */ char inv_order[MAXOCLASSES]; char pickup_types[MAXOCLASSES]; #define NUM_DISCLOSURE_OPTIONS 5 diff --git a/include/patchlevel.h b/include/patchlevel.h index 2b969c2b2..4a5d84f3c 100644 --- a/include/patchlevel.h +++ b/include/patchlevel.h @@ -13,7 +13,7 @@ * Incrementing EDITLEVEL can be used to force invalidation of old bones * and save files. */ -#define EDITLEVEL 38 +#define EDITLEVEL 39 #define COPYRIGHT_BANNER_A \ "NetHack, Copyright 1985-2007" diff --git a/src/invent.c b/src/invent.c index d79cc37b1..a34c7445a 100644 --- a/src/invent.c +++ b/src/invent.c @@ -2336,7 +2336,7 @@ char *buf; return dfeature; } -/* look at what is here; if there are many objects (5 or more), +/* look at what is here; if there are many objects (pile_limit or more), don't show them unless obj_cnt is 0 */ int look_here(obj_cnt, picked_some) @@ -2349,8 +2349,11 @@ boolean picked_some; const char *dfeature = (char *)0; char fbuf[BUFSZ], fbuf2[BUFSZ]; winid tmpwin; - boolean skip_objects = (obj_cnt >= 5), felt_cockatrice = FALSE; + boolean skip_objects, felt_cockatrice = FALSE; + /* default pile_limit is 5; a value of 0 means "never skip" + (and 1 effectively forces "always skip") */ + skip_objects = (flags.pile_limit > 0 && obj_cnt >= flags.pile_limit); if (u.uswallow && u.ustuck) { struct monst *mtmp = u.ustuck; Sprintf(fbuf, "Contents of %s %s", @@ -2420,12 +2423,18 @@ boolean picked_some; if (skip_objects) { if (dfeature) pline(fbuf); read_engr_at(u.ux, u.uy); /* Eric Backus */ - There("are %s%s objects here.", - (obj_cnt <= 10) ? "several" : "many", - picked_some ? " more" : ""); + if (obj_cnt == 1 && otmp->quan == 1L) + There("is %s object here.", picked_some ? "another" : "an"); + else + There("are %s%s objects here.", + (obj_cnt < 5) ? "a few" : + (obj_cnt < 10) ? "several" : "many", + picked_some ? " more" : ""); for ( ; otmp; otmp = otmp->nexthere) if (otmp->otyp == CORPSE && will_feel_cockatrice(otmp, FALSE)) { - pline("Including %s%s.", + pline("%s %s%s.", + (obj_cnt > 1) ? "Including" : + (otmp->quan > 1L) ? "They're" : "It's", corpse_xname(otmp, (const char *)0, CXN_ARTICLE), poly_when_stoned(youmonst.data) ? "" : ", unfortunately"); @@ -2442,20 +2451,22 @@ boolean picked_some; You("%s here %s.", verb, doname(otmp)); if (otmp->otyp == CORPSE) feel_cockatrice(otmp, FALSE); } else { + char buf[BUFSZ]; + display_nhwindow(WIN_MESSAGE, FALSE); tmpwin = create_nhwindow(NHW_MENU); if(dfeature) { putstr(tmpwin, 0, fbuf); putstr(tmpwin, 0, ""); } - putstr(tmpwin, 0, Blind ? "Things that you feel here:" : - "Things that are here:"); + Sprintf(buf, "%s that %s here:", + picked_some ? "Other things" : "Things", + Blind ? "you feel" : "are"); + putstr(tmpwin, 0, buf); for ( ; otmp; otmp = otmp->nexthere) { if (otmp->otyp == CORPSE && will_feel_cockatrice(otmp, FALSE)) { - char buf[BUFSZ]; felt_cockatrice = TRUE; - Strcpy(buf, doname(otmp)); - Strcat(buf, "..."); + Sprintf(buf, "%s...", doname(otmp)); putstr(tmpwin, 0, buf); break; } diff --git a/src/options.c b/src/options.c index 176a19f58..06d71ff08 100644 --- a/src/options.c +++ b/src/options.c @@ -1,4 +1,4 @@ -/* SCCS Id: @(#)options.c 3.5 2007/02/14 */ +/* SCCS Id: @(#)options.c 3.5 2007/04/26 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ @@ -33,6 +33,8 @@ NEARDATA struct instance_flags iflags; /* provide linkage */ #define MENU_OPTION 4 #define TEXT_OPTION 5 +#define PILE_LIMIT_DFLT 5 + /* * NOTE: If you add (or delete) an option, please update the short * options help (option_help()), the long options help (dat/opthelp), @@ -320,6 +322,8 @@ static struct Comp_Opt 20, SET_IN_GAME }, { "pickup_types", "types of objects to pick up automatically", MAXOCLASSES, SET_IN_GAME }, + { "pile_limit", "threshold for \"there are many objects here\"", + 24, SET_IN_GAME }, { "playmode", #ifdef WIZARD "normal play, non-scoring explore mode, or debug mode", @@ -588,6 +592,7 @@ initoptions() flags.end_own = FALSE; flags.end_top = 3; flags.end_around = 2; + flags.pile_limit = PILE_LIMIT_DFLT; /* 5 */ flags.runmode = RUN_LEAP; iflags.msg_history = 20; #ifdef TTY_GRAPHICS @@ -1845,6 +1850,23 @@ goodfruit: return; } + /* pile limit: when walking over objects, number which triggers + "there are several/many objects here" instead of listing them */ + fullname = "pile_limit"; + if (match_optname(opts, fullname, 4, TRUE)) { + if (duplicate) complain_about_duplicate(opts, 1); + op = string_for_opt(opts, negated); + if ((negated && !op) || (!negated && op)) + flags.pile_limit = negated ? 0 : atoi(op); + else if (negated) + bad_negation(fullname, TRUE); + else /* !op */ + flags.pile_limit = PILE_LIMIT_DFLT; + /* sanity check */ + if (flags.pile_limit < 0) flags.pile_limit = PILE_LIMIT_DFLT; + return; + } + /* play mode: normal, explore/discovery, or debug/wizard */ fullname = "playmode"; if (match_optname(opts, fullname, 4, TRUE)) { @@ -3573,6 +3595,8 @@ char *buf; oc_to_str(flags.pickup_types, ocl); Sprintf(buf, "%s", ocl[0] ? ocl : "all" ); } + else if (!strcmp(optname, "pile_limit")) + Sprintf(buf, "%d", flags.pile_limit); else if (!strcmp(optname, "playmode")) { Strcpy(buf, wizard ? "debug" : discover ? "explore" : "normal");