diff --git a/dat/opthelp b/dat/opthelp index ff1f18663..7ec3f58a6 100644 --- a/dat/opthelp +++ b/dat/opthelp @@ -24,6 +24,7 @@ null allow nulls to be sent to your terminal [TRUE] try turning this option off (forcing NetHack to use its own delay code) if moving objects seem to teleport across rooms perm_invent keep inventory in a permanent window [FALSE] +pickup_thrown override pickup_types for thrown objects [TRUE] prayconfirm use confirmation prompt when #pray command issued [TRUE] pushweapon when wielding a new weapon, put your previously wielded weapon into the secondary weapon slot [FALSE] diff --git a/doc/Guidebook.mn b/doc/Guidebook.mn index 9835870fa..80d054392 100644 --- a/doc/Guidebook.mn +++ b/doc/Guidebook.mn @@ -2083,6 +2083,12 @@ When you pick up an item that would exceed this encumbrance level (Unburdened, Burdened, streSsed, straiNed, overTaxed, or overLoaded), you will be asked if you want to continue. (Default `S'). +.lp pickup_thrown +If this option is on and +.op autopickup +is also on, try to pick up things that you threw, even if they aren't in +.op pickup_types +or match an autopickup exception. Default is on. .lp pickup_types Specify the object types to be picked up when .op autopickup diff --git a/doc/Guidebook.tex b/doc/Guidebook.tex index dbaaec698..9c9fff7fb 100644 --- a/doc/Guidebook.tex +++ b/doc/Guidebook.tex @@ -27,7 +27,7 @@ \begin{document} % % input file: guidebook.mn -% $Revision: 1.97 $ $Date: 2006/04/23 17:22:45 $ +% $Revision: 1.98 $ $Date: 2006/04/30 17:55:09 $ % %.ds h0 " %.ds h1 %.ds h2 \% @@ -2550,6 +2550,11 @@ level (Unburdened, Burdened, streSsed, straiNed, overTaxed, or overLoaded), you will be asked if you want to continue. (Default `S'). %.lp +\item[\ib{pickup\_thrown}] +If this option is on and ``{\it autopickup\/}'' is also on, try to pick up +things that you threw, even if they aren't in ``{\it pickup\_types\/}'' or +match an autopickup exception. Default is on. +%.lp \item[\ib{pickup\_types}] Specify the object types to be picked up when ``{\it autopickup\/}'' is on. Default is all types. If your copy of the game has the diff --git a/doc/fixes35.0 b/doc/fixes35.0 index b2b74a275..c8dbf173c 100644 --- a/doc/fixes35.0 +++ b/doc/fixes35.0 @@ -200,6 +200,7 @@ allow digging an adjacent pit with wand of digging while trapped in a pit #terrain command for debug mode digging can activate or disarm some types of traps some monsters can eat tins in addition to corpses to cure some ailments +add Roderick Schertler's pickup_thrown patch Platform- and/or Interface-Specific New Features diff --git a/include/flag.h b/include/flag.h index b4bcb101b..78071eae3 100644 --- a/include/flag.h +++ b/include/flag.h @@ -38,7 +38,7 @@ struct flag { boolean null; /* OK to send nulls to the terminal */ boolean perm_invent; /* keep full inventories up until dismissed */ boolean pickup; /* whether you pickup or move and look */ - + boolean pickup_thrown; /* auto-pickup items you threw */ boolean pushweapon; /* When wielding, push old weapon into second slot */ boolean rest_on_space; /* space means rest */ boolean safe_dog; /* give complete protection to the dog */ diff --git a/include/obj.h b/include/obj.h index 1748f5ccb..98e43c032 100644 --- a/include/obj.h +++ b/include/obj.h @@ -99,7 +99,7 @@ struct obj { #endif Bitfield(greased,1); /* covered with grease */ Bitfield(nomerge,1); /* set temporarily to prevent merging */ - /* 1 free bit */ + Bitfield(was_thrown,1); /* thrown by hero since last picked up */ Bitfield(in_use,1); /* for magic items before useup items */ Bitfield(bypass,1); /* mark this as an object to be skipped by bhito() */ diff --git a/src/bones.c b/src/bones.c index fc51a5188..df182e6ee 100644 --- a/src/bones.c +++ b/src/bones.c @@ -88,6 +88,7 @@ boolean restore; otmp->cknown = 0; otmp->invlet = 0; otmp->no_charge = 0; + otmp->was_thrown = 0; /* strip user-supplied names */ /* Statue and some corpse names are left intact, diff --git a/src/dothrow.c b/src/dothrow.c index e97914d3c..489bfbe3a 100644 --- a/src/dothrow.c +++ b/src/dothrow.c @@ -923,6 +923,7 @@ boolean twoweap; /* used to restore twoweapon mode if wielded weapon returns */ } thrownobj = obj; + thrownobj->was_thrown = 1; if(u.uswallow) { mon = u.ustuck; diff --git a/src/invent.c b/src/invent.c index 74e8da1fd..8040d0024 100644 --- a/src/invent.c +++ b/src/invent.c @@ -298,6 +298,7 @@ struct obj *obj; if (obj->where != OBJ_FREE) panic("addinv: obj not free"); obj->no_charge = 0; /* not meaningful for invent */ + obj->was_thrown = 0; /* ditto */ addinv_core1(obj); #ifndef GOLDOBJ diff --git a/src/options.c b/src/options.c index 965385662..a08a41acf 100644 --- a/src/options.c +++ b/src/options.c @@ -155,6 +155,7 @@ static struct Bool_Opt {"page_wait", (boolean *)0, FALSE, SET_IN_FILE}, #endif {"perm_invent", &flags.perm_invent, FALSE, SET_IN_GAME}, + {"pickup_thrown", &flags.pickup_thrown, TRUE, SET_IN_GAME}, {"popup_dialog", &iflags.wc_popup_dialog, FALSE, SET_IN_GAME}, /*WC*/ {"prayconfirm", &flags.prayconfirm, TRUE, SET_IN_GAME}, {"preload_tiles", &iflags.wc_preload_tiles, TRUE, DISP_IN_GAME}, /*WC*/ diff --git a/src/pickup.c b/src/pickup.c index 2d1657418..23072b400 100644 --- a/src/pickup.c +++ b/src/pickup.c @@ -662,35 +662,39 @@ menu_item **pick_list; /* list of objects and counts to pick up */ menu_item *pi; /* pick item */ struct obj *curr; int n; + boolean pickit; const char *otypes = flags.pickup_types; /* first count the number of eligible items */ - for (n = 0, curr = olist; curr; curr = FOLLOW(curr, follow)) - - -#ifndef AUTOPICKUP_EXCEPTIONS - if (!*otypes || index(otypes, curr->oclass)) -#else - if ((!*otypes || index(otypes, curr->oclass) || - is_autopickup_exception(curr, TRUE)) && - !is_autopickup_exception(curr, FALSE)) + for (n = 0, curr = olist; curr; curr = FOLLOW(curr, follow)) { + pickit = (!*otypes || index(otypes, curr->oclass)); +#ifdef AUTOPICKUP_EXCEPTIONS + /* check for "always pick up */ + if (!pickit) pickit = is_autopickup_exception(curr, TRUE); + /* then for "never pick up */ + if (pickit) pickit = !is_autopickup_exception(curr, FALSE); #endif - n++; + /* pickup_thrown overrides pickup_types and exceptions */ + if (!pickit) pickit = (flags.pickup_thrown && curr->was_thrown); + /* finally, do we count this object? */ + if (pickit) ++n; + } if (n) { *pick_list = pi = (menu_item *) alloc(sizeof(menu_item) * n); - for (n = 0, curr = olist; curr; curr = FOLLOW(curr, follow)) -#ifndef AUTOPICKUP_EXCEPTIONS - if (!*otypes || index(otypes, curr->oclass)) { -#else - if ((!*otypes || index(otypes, curr->oclass) || - is_autopickup_exception(curr, TRUE)) && - !is_autopickup_exception(curr, FALSE)) { + for (n = 0, curr = olist; curr; curr = FOLLOW(curr, follow)) { + pickit = (!*otypes || index(otypes, curr->oclass)); +#ifdef AUTOPICKUP_EXCEPTIONS + if (!pickit) pickit = is_autopickup_exception(curr, TRUE); + if (pickit) pickit = !is_autopickup_exception(curr, FALSE); #endif + if (!pickit) pickit = (flags.pickup_thrown && curr->was_thrown); + if (pickit) { pi[n].item.a_obj = curr; pi[n].count = curr->quan; n++; } + } } return n; }