allow_category: honor 'goldX' more consistently
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).
This commit is contained in:
29
src/pickup.c
29
src/pickup.c
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user