#ifdef AUTOPICKUP_EXCEPTIONS
struct autopickup_exception {
char *pattern;
+ boolean grab;
struct autopickup_exception *next;
};
-
#endif /* AUTOPICKUP_EXCEPTIONS */
+
#undef E
#endif /* DECL_H */
E int NDECL(dotip);
E const char *FDECL(safe_qbuf, (const char *,unsigned,
const char *,const char *,const char *));
+E boolean FDECL(is_autopickup_exception, (struct obj *, BOOLEAN_P));
/* ### pline.c ### */
tmpwin = create_nhwindow(NHW_TEXT);
ape = iflags.autopickup_exceptions;
for (i = 0; i < numapes && ape; i++) {
- Sprintf(apebuf, "\"%s\"", ape->pattern);
- putstr(tmpwin, 0, ape->pattern);
+ Sprintf(apebuf, "\"%s\" (%s)",
+ ape->pattern,
+ ape->grab ? "always pickup" : "never pickup");
+ putstr(tmpwin, 0, apebuf);
ape = ape->next;
}
display_nhwindow(tmpwin, FALSE);
const char *mapping;
{
struct autopickup_exception *newape, *ape;
- char text[256];
+ char text[256], *text2;
static int allocsize = 0;
int textsize = 0;
+ boolean grab = FALSE;
if (sscanf(mapping, "\"%255[^\"]\"", text) == 1) {
- textsize = strlen(text);
+ text2 = &text[0];
+ if (*text2 == '<') { /* force autopickup */
+ grab = TRUE;
+ ++text2;
+ } else if (*text2 == '>') { /* default - Do not pickup */
+ grab = FALSE;
+ ++text2;
+ }
+ textsize = strlen(text2);
if (!iflags.autopickup_exceptions) {
iflags.autopickup_exceptions = (struct autopickup_exception *)
alloc(sizeof(struct autopickup_exception));
iflags.autopickup_exceptions->pattern = (char *)
alloc(textsize+1);
- Strcpy(iflags.autopickup_exceptions->pattern, text);
+ Strcpy(iflags.autopickup_exceptions->pattern, text2);
+ iflags.autopickup_exceptions->grab = grab;
iflags.autopickup_exceptions->next =
(struct autopickup_exception *)0;
} else {
newape = (struct autopickup_exception *)alloc(
sizeof(struct autopickup_exception));
newape->pattern = (char *)alloc(textsize+1);
- Strcpy(newape->pattern, text);
+ Strcpy(newape->pattern, text2);
+ newape->grab = grab;
newape->next = iflags.autopickup_exceptions;
iflags.autopickup_exceptions = newape;
}
#ifdef AUTOPICKUP_EXCEPTIONS
boolean
-is_autopickup_exception(obj)
+is_autopickup_exception(obj, grab)
struct obj *obj;
+boolean grab; /* forced pickup, rather than forced leave behind? */
{
/*
* Does the text description of this match an exception?
char *objdesc = makesingular(xname(obj));
struct autopickup_exception *ape = iflags.autopickup_exceptions;
while (ape) {
- if (pmatch(ape->pattern, objdesc)) return TRUE;
+ if (pmatch(ape->pattern, objdesc) &&
+ ((grab && ape->grab) || (!grab && !ape->grab))) return TRUE;
ape = ape->next;
}
return FALSE;
/* first count the number of eligible items */
for (n = 0, curr = olist; curr; curr = FOLLOW(curr, follow))
- if ((!*otypes || index(otypes, curr->oclass))
-#ifdef AUTOPICKUP_EXCEPTIONS
- && !is_autopickup_exception(curr)
+
+#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))
#endif
- );
n++;
if (n) {
*pick_list = pi = (menu_item *) alloc(sizeof(menu_item) * n);
for (n = 0, curr = olist; curr; curr = FOLLOW(curr, follow))
- if ((!*otypes || index(otypes, curr->oclass))
-#ifdef AUTOPICKUP_EXCEPTIONS
- && !is_autopickup_exception(curr)
+#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)) {
#endif
- ) {
pi[n].item.a_obj = curr;
pi[n].count = curr->quan;
n++;