From: nethack.rankin Date: Sat, 13 May 2006 04:57:52 +0000 (+0000) Subject: add pickup_thrown option (trunk only) X-Git-Tag: MOVE2GIT~1017 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9151db8aaf33f6909b388c5ee24b206e89e8ce84;p=nethack add pickup_thrown option (trunk only) This patch by was released when 3.4.1 was current and has been incorporated into slash'em. It is extremely useful while using ranged weapons. When both autopickup and pickup_thrown are enabled, walking across previously thrown objects will pick them up even if they don't match the current pickup_types list. [See cvs log for patchlevel.h for longer description.] --- 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; }