/* * Determines if an object is already squelched. Same as squelch_item_ok above, * without the first (p_ptr->unignoring) test. */ bool object_is_squelched(const object_type *o_ptr) { byte type; /* Do squelch individual objects that marked ignore */ if (o_ptr->ignore) return TRUE; /* Don't squelch artifacts unless marked to be squelched */ if (o_ptr->artifact || check_for_inscrip(o_ptr, "!k") || check_for_inscrip(o_ptr, "!*")) return FALSE; /* Do squelching by kind */ if (object_flavor_is_aware(o_ptr) ? kind_is_squelched_aware(o_ptr->kind) : kind_is_squelched_unaware(o_ptr->kind)) return TRUE; type = squelch_type_of(o_ptr); if (type == TYPE_MAX) return FALSE; /* Squelch items known not to be special */ if (object_is_known_not_artifact(o_ptr) && squelch_level[type] == SQUELCH_ALL) return TRUE; /* Get result based on the feeling and the squelch_level */ if (squelch_level_of(o_ptr) <= squelch_level[type]) return TRUE; else return FALSE; }
/* * Inquire whether the player wishes to squelch items similar to an object * * Returns whether the item is now squelched. */ bool squelch_interactive(const object_type *o_ptr) { char out_val[70]; if (squelch_tval(o_ptr->tval)) { char sval_name[50]; /* Obtain plural form without a quantity */ object_desc(sval_name, sizeof sval_name, o_ptr, ODESC_BASE | ODESC_PLURAL); /* XXX Eddie while correct in a sense, to squelch all torches on torch of brightness you get the message "Ignore Wooden Torches of Brightness in future? " */ strnfmt(out_val, sizeof out_val, "Ignore %s in future? ", sval_name); if (!artifact_p(o_ptr) || !object_flavor_is_aware(o_ptr)) { if (get_check(out_val)) { object_squelch_flavor_of(o_ptr); msg_format("Ignoring %s from now on.", sval_name); return TRUE; } } /* XXX Eddie need to add generalized squelching, e.g. con rings with pval < 3 */ if (!object_is_jewelry(o_ptr) || (squelch_level_of(o_ptr) != SQUELCH_BAD)) return FALSE; } if (object_was_sensed(o_ptr) || object_was_worn(o_ptr) || object_is_known_not_artifact(o_ptr)) { byte value = squelch_level_of(o_ptr); int type = squelch_type_of(o_ptr); /* XXX Eddie on pseudoed cursed artifact, only showed {cursed}, asked to ignore artifacts */ if ((value != SQUELCH_MAX) && ((value == SQUELCH_BAD) || !object_is_jewelry(o_ptr))) { strnfmt(out_val, sizeof out_val, "Ignore all %s that are %s in future? ", quality_choices[type].name, quality_values[value].name); if (get_check(out_val)) { squelch_level[type] = value; return TRUE; } } } return FALSE; }
/* * Determines if an object is eligible for squelching. */ bool squelch_item_ok(const object_type *o_ptr) { object_kind *k_ptr = &k_info[o_ptr->k_idx]; byte type; /* Don't squelch artifacts unless marked to be squelched */ if (artifact_p(o_ptr)) return FALSE; /* Don't squelch stuff inscribed not to be destroyed (!k) */ if (check_for_inscrip(o_ptr, "!k") || check_for_inscrip(o_ptr, "!*")) return FALSE; /* Auto-squelch dead chests */ if (o_ptr->tval == TV_CHEST && o_ptr->pval == 0) return TRUE; /* check option for worthless kinds */ if (OPT(squelch_worthless) && o_ptr->tval != TV_GOLD) { if (object_flavor_is_aware(o_ptr) && k_ptr->cost == 0) return TRUE; if (object_is_known_cursed(o_ptr)) return TRUE; } /* Do squelching by kind */ if (object_flavor_is_aware(o_ptr) ? kind_is_squelched_aware(k_ptr) : kind_is_squelched_unaware(k_ptr)) return TRUE; type = squelch_type_of(o_ptr); if (type == TYPE_MAX) return FALSE; /* Squelch items known not to be special */ if (object_is_known_not_artifact(o_ptr) && squelch_level[type] == SQUELCH_ALL) return TRUE; /* Get result based on the feeling and the squelch_level */ if (squelch_level_of(o_ptr) <= squelch_level[type]) return TRUE; else return FALSE; }
void textui_cmd_destroy(void) { int item; object_type *o_ptr; char out_val[160]; menu_type *m; region r; int selected; /* Get an item */ const char *q = "Ignore which item? "; const char *s = "You have nothing to ignore."; if (!get_item(&item, q, s, CMD_DESTROY, USE_INVEN | USE_EQUIP | USE_FLOOR)) return; o_ptr = object_from_item_idx(item); m = menu_dynamic_new(); m->selections = lower_case; /* Basic ignore option */ if (!o_ptr->ignore) { menu_dynamic_add(m, "This item only", IGNORE_THIS_ITEM); } else { menu_dynamic_add(m, "Unignore this item", UNIGNORE_THIS_ITEM); } /* Flavour-aware squelch */ if (squelch_tval(o_ptr->tval) && (!o_ptr->artifact || !object_flavor_is_aware(o_ptr))) { bool squelched = kind_is_squelched_aware(o_ptr->kind) || kind_is_squelched_unaware(o_ptr->kind); char tmp[70]; object_desc(tmp, sizeof(tmp), o_ptr, ODESC_BASE | ODESC_PLURAL); if (!squelched) { strnfmt(out_val, sizeof out_val, "All %s", tmp); menu_dynamic_add(m, out_val, IGNORE_THIS_FLAVOR); } else { strnfmt(out_val, sizeof out_val, "Unignore all %s", tmp); menu_dynamic_add(m, out_val, UNIGNORE_THIS_FLAVOR); } } /* Quality squelching */ if (object_was_sensed(o_ptr) || object_was_worn(o_ptr) || object_is_known_not_artifact(o_ptr)) { byte value = squelch_level_of(o_ptr); int type = squelch_type_of(o_ptr); if (object_is_jewelry(o_ptr) && squelch_level_of(o_ptr) != SQUELCH_BAD) value = SQUELCH_MAX; if (value != SQUELCH_MAX && type != TYPE_MAX) { strnfmt(out_val, sizeof out_val, "All %s %s", quality_values[value].name, quality_choices[type].name); menu_dynamic_add(m, out_val, IGNORE_THIS_QUALITY); } } /* work out display region */ r.width = menu_dynamic_longest_entry(m) + 3 + 2; /* +3 for tag, 2 for pad */ r.col = 80 - r.width; r.row = 1; r.page_rows = m->count; screen_save(); menu_layout(m, &r); region_erase_bordered(&r); prt("(Enter to select, ESC) Ignore:", 0, 0); selected = menu_dynamic_select(m); screen_load(); if (selected == IGNORE_THIS_ITEM) { cmd_insert(CMD_DESTROY); cmd_set_arg_item(cmd_get_top(), 0, item); } else if (selected == UNIGNORE_THIS_ITEM) { o_ptr->ignore = FALSE; } else if (selected == IGNORE_THIS_FLAVOR) { object_squelch_flavor_of(o_ptr); } else if (selected == UNIGNORE_THIS_FLAVOR) { kind_squelch_clear(o_ptr->kind); } else if (selected == IGNORE_THIS_QUALITY) { byte value = squelch_level_of(o_ptr); int type = squelch_type_of(o_ptr); squelch_level[type] = value; } p_ptr->notice |= PN_SQUELCH; menu_dynamic_free(m); }