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:
38
src/pickup.c
38
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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user