]> granicus.if.org Git - nethack/commitdiff
autopickup_exceptions enhancement
authornethack.allison <nethack.allison>
Sat, 15 Nov 2003 02:49:07 +0000 (02:49 +0000)
committernethack.allison <nethack.allison>
Sat, 15 Nov 2003 02:49:07 +0000 (02:49 +0000)
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"

include/decl.h
include/extern.h
src/options.c
src/pickup.c

index 56a15c9e8fbc7f2b41d2dd3d36bf5d9ec7f0c325..12452c731ef9c65cd562847b81ece9d8842929ad 100644 (file)
@@ -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 */
index 2e744071b9806b1d819c53ea460b2308c661973c..f777c3bca70d0dfc19c5fb7ede8f60ae1fef8f87 100644 (file)
@@ -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 ### */
 
index a7905fd8784ceaf4cc2f9578097c6b1edc668fac..02f0f6ed02240dc5954fa290324a245e32272503 100644 (file)
@@ -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;
                }
index ac3e43c3f0f35462de97235bc97f5123a827b100..ce0b21e81f687d52a3b31b324054122bb8de0245 100644 (file)
@@ -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++;