add pickup_thrown option (trunk only)

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.]
This commit is contained in:
nethack.rankin
2006-05-13 04:57:52 +00:00
parent 151bff298c
commit 9151db8aaf
11 changed files with 41 additions and 20 deletions

View 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]

View 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

View 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

View 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

View 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 */

View 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() */

View 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,

View 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;

View 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

View 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*/

View 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;
}