]> granicus.if.org Git - nethack/commitdiff
allow_category: honor 'goldX' more consistently
authorMichael Meyer <me@entrez.cc>
Mon, 27 Jun 2022 20:17:52 +0000 (16:17 -0400)
committerPatR <rankin@nethack.org>
Sun, 3 Jul 2022 23:52:06 +0000 (16:52 -0700)
A comment in allow_category states that if gold is explicitly selected
as a category, it should be included in the results regardless of what
other BUCX filters may have also been applied.  That makes sense to me:
there's only one thing in the gold category, and it always has the same
BUCX status, so it's pointless to try to "filter" the gold category with
a BUCX filter.  Considering it a "also add gold, on top of the filtered
results" category adds utility.

However, other categories which may include gold (specifically
justpicked; unpaid is in the code too, but that can't actually happen
in-game) were treated the same way: if the category included gold, no
filter could exclude it.  As a result, if the hero had just picked up
gold, 'P'+'C', 'P'+'U', 'P'+'X', and 'P'+'B' all showed the just-picked
gold pieces -- there was no way to filter justpicked to exclude gold
the BUCX categories.  This approach made less sense to me: justpicked as
a category may include gold, but filtering by BUCX actually has utility
there, and selecting it doesn't carry a "show me gold in addition to the
other filtered items" implication.

Maintain the same special treatment of selecting the coins category, but
drop it for justpicked and unpaid.  In those cases whether gold is
listed in the justpicked result will depend on it not being filtered out
by the selected BUCX categories (and which one it belongs to, in turn,
depends on the 'goldX' option).

src/pickup.c

index c8471e43dff73ce9336768d76710c75951a97784..21751d2ce86882d5209869d8029877907b9a52a6 100644 (file)
@@ -459,20 +459,9 @@ allow_category(struct obj *obj)
     /* For coins, if any class filter is specified, accept if coins
      * are included regardless of whether either unpaid or BUC-status
      * is also specified since player has explicitly requested coins.
-     * If no class filtering is specified but bless/curse state is,
-     * coins are either unknown or uncursed based on an option setting.
      */
-    if (obj->oclass == COIN_CLASS)
-        return g.class_filter
-                 ? (index(g.valid_menu_classes, COIN_CLASS) ? TRUE : FALSE)
-                 : g.shop_filter /* coins are never unpaid, but check anyway */
-                    ? (obj->unpaid ? TRUE : FALSE)
-            : g.picked_filter
-            ? obj->pickup_prev
-                    : g.bucx_filter
-                       ? (index(g.valid_menu_classes, flags.goldX ? 'X' : 'U')
-                          ? TRUE : FALSE)
-                       : TRUE; /* catchall: no filters specified, so accept */
+    if (obj->oclass == COIN_CLASS && g.class_filter)
+        return index(g.valid_menu_classes, COIN_CLASS) ? TRUE : FALSE;
 
     if (Role_if(PM_CLERIC) && !obj->bknown)
         set_bknown(obj, 1);
@@ -505,8 +494,18 @@ allow_category(struct obj *obj)
     /* check for particular bless/curse state */
     if (g.bucx_filter) {
         /* first categorize this object's bless/curse state */
-        char bucx = !obj->bknown ? 'X'
-                      : obj->blessed ? 'B' : obj->cursed ? 'C' : 'U';
+        char bucx;
+        if (obj->oclass == COIN_CLASS) {
+            /* If no class filtering is specified but bless/curse state is,
+               coins are treated as either unknown or uncursed based on an
+               option setting. */
+            bucx = flags.goldX ? 'X' : 'U';
+        } else {
+            bucx = !obj->bknown ? 'X'
+                     : obj->blessed ? 'B'
+                        : obj->cursed ? 'C'
+                           : 'U';
+        }
 
         /* if its category is not in the list, reject */
         if (!index(g.valid_menu_classes, bucx))