예제 #1
0
/**
 * Determines if an object is eligable for squelching.
 */
extern bool squelch_item_ok(const object_type * o_ptr)
{
	size_t i;
	int num = -1;

	object_kind *k_ptr = &k_info[o_ptr->k_idx];
	bool fullid = object_known_p(o_ptr);
	bool sensed = (o_ptr->ident & IDENT_SENSE) || fullid;
	byte feel =
		fullid ? value_check_aux1((object_type *) o_ptr) : o_ptr->feel;
	int quality_squelch = SQUELCH_NONE;

	/* Don't squelch artifacts */
	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;

	/* Do squelching by sval, if we 'know' the flavour. */
	if (k_ptr->squelch && (k_ptr->flavor == 0 || k_ptr->aware)) {
		if (squelch_tval(k_info[o_ptr->k_idx].tval))
			return TRUE;
	}

	/* Squelch some ego items if known */
	if (has_ego_properties(o_ptr) && (e_info[o_ptr->name2].squelch)) {
		return TRUE;
	}

	/* Don't check pseudo-ID for nonsensed things */
	if (!sensed)
		return FALSE;

	/* Find the appropriate squelch group */
	for (i = 0; i < N_ELEMENTS(quality_choices); i++) {
		if (quality_choices[i].tval == o_ptr->tval) {
			num = i;
			break;
		}
	}

	/* Never squelched */
	if (num == -1)
		return FALSE;

	/* Get result based on the feeling and the squelch_profile */
	quality_squelch = feel_to_squelch_level(feel);

	if (quality_squelch == SQUELCH_NONE)
		return FALSE;
	else
		return squelch_profile[num][quality_squelch];
}
예제 #2
0
/*
 * Squelch the flavor of an object
 */
static void object_squelch_flavor_of(const object_type *o_ptr)
{
	assert(squelch_tval(o_ptr->tval));
	if (object_flavor_is_aware(o_ptr))
		k_info[o_ptr->k_idx].squelch |= SQUELCH_IF_AWARE;
	else
		k_info[o_ptr->k_idx].squelch |= SQUELCH_IF_UNAWARE;
}
예제 #3
0
/*
 * 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;
}
예제 #4
0
/**
 * Determines if an object is eligable for squelching.
 */
extern bool squelch_item_ok(const object_type * o_ptr)
{
	size_t i;
	int num = -1;

	object_kind *k_ptr = &k_info[o_ptr->k_idx];
	bool fullid = object_known_p(o_ptr);
	bool sensed = (o_ptr->ident & IDENT_SENSE) || fullid;
	byte feel =
		fullid ? value_check_aux1((object_type *) o_ptr) : o_ptr->feel;


	/* Don't squelch artifacts */
	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;

	/* Do squelching by sval, if we 'know' the flavour. */
	if (k_ptr->squelch && (k_ptr->flavor == 0 || k_ptr->aware)) {
		if (squelch_tval(k_info[o_ptr->k_idx].tval))
			return TRUE;
	}

	/* Squelch some ego items if known */
	if (has_ego_properties(o_ptr) && (e_info[o_ptr->name2].squelch)) {
		return TRUE;
	}


	/* Don't check pseudo-ID for nonsensed things */
	if (!sensed)
		return FALSE;



	/* Find the appropriate squelch group */
	for (i = 0; i < N_ELEMENTS(quality_choices); i++) {
		if (quality_choices[i].enum_val == o_ptr->tval) {
			num = i;
			break;
		}
	}

	/* Never squelched */
	if (num == -1)
		return FALSE;


	/* Get result based on the feeling and the squelch_level */
	switch (squelch_level[num]) {
	case SQUELCH_CURSED:
		{
			if (o_ptr->ident & IDENT_CURSED) {
				return TRUE;
			}

			break;
		}

	case SQUELCH_DUBIOUS:
		{
			if ((feel == FEEL_DUBIOUS_WEAK) || (feel == FEEL_PERILOUS) ||
				(feel == FEEL_DUBIOUS_STRONG)) {
				return TRUE;
			}

			break;
		}

	case SQUELCH_DUBIOUS_NON:
		{
			if (feel == FEEL_DUBIOUS_STRONG) {
				return TRUE;
			}

			break;
		}

	case SQUELCH_NON_EGO:
		{
			if ((feel == FEEL_DUBIOUS_STRONG) || (feel == FEEL_AVERAGE) ||
				(feel == FEEL_GOOD_STRONG)) {
				return TRUE;
			}

			break;
		}

	case SQUELCH_AVERAGE:
		{
			if ((feel == FEEL_DUBIOUS_WEAK) || (feel == FEEL_PERILOUS) ||
				(feel == FEEL_DUBIOUS_STRONG) || (feel == FEEL_AVERAGE)) {
				return TRUE;
			}

			break;
		}

	case SQUELCH_GOOD_STRONG:
		{
			if ((feel == FEEL_PERILOUS) || (feel == FEEL_DUBIOUS_STRONG) ||
				(feel == FEEL_AVERAGE) || (feel == FEEL_GOOD_STRONG)) {
				return TRUE;
			}

			break;
		}

	case SQUELCH_GOOD_WEAK:
		{
			if ((feel == FEEL_PERILOUS) || (feel == FEEL_DUBIOUS_STRONG) ||
				(feel == FEEL_AVERAGE) || (feel == FEEL_GOOD_WEAK) ||
				(feel == FEEL_GOOD_STRONG)) {
				return TRUE;
			}

			break;
		}

	case SQUELCH_ALL:
		{
			return TRUE;
			break;
		}
	}

	/* Failure */
	return FALSE;
}
예제 #5
0
/*
 * Special key actions for object inscription.
 */
static void o_xtra_act(struct keypress ch, int oid)
{
	object_kind *k = objkind_byid(oid);

	/* Toggle squelch */
	if (squelch_tval(k->tval) && (ch.code == 's' || ch.code == 'S'))
	{
		if (k->aware)
		{
			if (kind_is_squelched_aware(k))
				kind_squelch_clear(k);
			else
				kind_squelch_when_aware(k);
		}
		else
		{
			if (kind_is_squelched_unaware(k))
				kind_squelch_clear(k);
			else
				kind_squelch_when_unaware(k);
		}

		return;
	}

	/* Forget it if we've never seen the thing */
	if (k->flavor && !k->aware)
		return;

	/* Uninscribe */
	if (ch.code == '}') {
		if (k->note)
			remove_autoinscription(oid);
	} else if (ch.code == '{') {
		/* Inscribe */
		char note_text[80] = "";

		/* Avoid the prompt getting in the way */
		screen_save();

		/* Prompt */
		prt("Inscribe with: ", 0, 0);

		/* Default note */
		if (k->note)
			strnfmt(note_text, sizeof(note_text), "%s", get_autoinscription(k));

		/* Get an inscription */
		if (askfor_aux(note_text, sizeof(note_text), NULL))
		{
			/* Remove old inscription if existent */
			if (k->note)
				remove_autoinscription(oid);

			/* Add the autoinscription */
			add_autoinscription(oid, note_text);

			/* Notice stuff (later) */
			p_ptr->notice |= (PN_AUTOINSCRIBE);
			p_ptr->redraw |= (PR_INVEN | PR_EQUIP);
		}

		/* Reload the screen */
		screen_load();
	}
}
예제 #6
0
파일: cmd3.c 프로젝트: CJNyfalt/angband
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);
}