From: nethack.allison Date: Sat, 15 Nov 2003 02:49:07 +0000 (+0000) Subject: autopickup_exceptions enhancement X-Git-Tag: MOVE2GIT~1594 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e9afb34423cb201206062127fcf6d3aeeed041d1;p=nethack autopickup_exceptions enhancement An enhancement to the original to allow two types of exceptions: always pickup never pickup To specify "never pickup", begin the pattern string with '>' which is NetHack's down direction symbol (for "leave it down") To specify "always pickup", begin the pattern string with '<' which is NetHack's up direction symbol. For example, to pick up all arrows, regardless of the pickup_ types setting: autopickup_exception = "<*arrows" --- diff --git a/include/decl.h b/include/decl.h index 56a15c9e8..12452c731 100644 --- a/include/decl.h +++ b/include/decl.h @@ -372,10 +372,11 @@ E char *fqn_prefix_names[PREFIX_COUNT]; #ifdef AUTOPICKUP_EXCEPTIONS struct autopickup_exception { char *pattern; + boolean grab; struct autopickup_exception *next; }; - #endif /* AUTOPICKUP_EXCEPTIONS */ + #undef E #endif /* DECL_H */ diff --git a/include/extern.h b/include/extern.h index 2e744071b..f777c3bca 100644 --- a/include/extern.h +++ b/include/extern.h @@ -1513,6 +1513,7 @@ E int FDECL(loot_mon, (struct monst *,int *,boolean *)); 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 ### */ diff --git a/src/options.c b/src/options.c index a7905fd87..02f0f6ed0 100644 --- a/src/options.c +++ b/src/options.c @@ -2846,8 +2846,10 @@ boolean setinitial,setfromfile; 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); @@ -3172,18 +3174,28 @@ add_autopickup_exception_mapping(mapping) 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 { @@ -3191,7 +3203,8 @@ const char *mapping; 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; } diff --git a/src/pickup.c b/src/pickup.c index ac3e43c3f..ce0b21e81 100644 --- a/src/pickup.c +++ b/src/pickup.c @@ -598,8 +598,9 @@ end_query: #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? @@ -607,7 +608,8 @@ struct obj *obj; 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; @@ -635,21 +637,26 @@ menu_item **pick_list; /* list of objects and counts to pick up */ /* 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++;