]> granicus.if.org Git - nethack/commitdiff
add pickup_thrown option (trunk only)
authornethack.rankin <nethack.rankin>
Sat, 13 May 2006 04:57:52 +0000 (04:57 +0000)
committernethack.rankin <nethack.rankin>
Sat, 13 May 2006 04:57:52 +0000 (04:57 +0000)
     This patch by <email deleted> 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.]

dat/opthelp
doc/Guidebook.mn
doc/Guidebook.tex
doc/fixes35.0
include/flag.h
include/obj.h
src/bones.c
src/dothrow.c
src/invent.c
src/options.c
src/pickup.c

index ff1f18663daab842ac8092f8fd34892a9fc2400d..7ec3f58a6d37859cffc51d3fbdc3c98f2194a9d2 100644 (file)
@@ -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]
index 9835870fa3152447c42d5bbd62fa05da0e985f14..80d0543924f5beef238006c7dc6e0102bc18de38 100644 (file)
@@ -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
index dbaaec698213151703ae894e2096875a3ac0db7f..9c9fff7fb3150dfddb62d3397c3c2e7495744a5a 100644 (file)
@@ -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 
index b2b74a275a47c9929bd419b1b6ab79beaa0c4e22..c8dbf173c6b55f8100dc60faea007fcebd54510a 100644 (file)
@@ -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
index b4bcb101b82bfa6a58de14433a975ab16c82066b..78071eae3073c0bebf75b95eb5519cbed9a0e0b9 100644 (file)
@@ -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 */
index 1748f5ccb94f492899cc019d506de2116cf667ba..98e43c032c66245144739bc8c6e5386d37462fb3 100644 (file)
@@ -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() */
index fc51a518820ff41c51c492993671bc88a4026f1e..df182e6ee833f7b709e0dc9569c84435e6be11b3 100644 (file)
@@ -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,
index e97914d3ceedb8866004c2b1cb86380873e780ac..489bfbe3ab95ac3e8dcf4001cf0d42315476a6c1 100644 (file)
@@ -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;
index 74e8da1fd72abf47cba87fea973dc035679537aa..8040d0024caa82b742a88e7477fb4271ec691346 100644 (file)
@@ -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
index 965385662861f6f686f3e3c51872ff27c072e710..a08a41acfcc6d3920289f39dc50ca30c34bac1d3 100644 (file)
@@ -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*/
index 2d16574188e67ae97347deb91d69d67eecd1cee8..23072b4007b9750847e3cebce6eaf30fd6384ada 100644 (file)
@@ -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;
 }