void object_notice_attack_plusses(object_type *o_ptr) { if (!o_ptr->k_idx) return; if (object_attack_plusses_are_visible(o_ptr)) return; if (object_add_ident_flags(o_ptr, IDENT_ATTACK)) object_check_for_ident(o_ptr); if (wield_slot(o_ptr) == INVEN_WIELD) { char o_name[80]; object_desc(o_name, sizeof(o_name), o_ptr, ODESC_BASE); message_format(MSG_PSEUDOID, 0, "You know more about the %s you are using.", o_name); } else if ((o_ptr->to_d || o_ptr->to_h) && !((o_ptr->tval == TV_HARD_ARMOR || o_ptr->tval == TV_SOFT_ARMOR) && (o_ptr->to_h < 0))) { char o_name[80]; object_desc(o_name, sizeof(o_name), o_ptr, ODESC_BASE); message_format(MSG_PSEUDOID, 0, "Your %s glows.", o_name); } p_ptr->update |= (PU_BONUS); event_signal(EVENT_INVENTORY); event_signal(EVENT_EQUIPMENT); }
/** * Notice the "effect" from activating an object. * * \param o_ptr is the object to become aware of */ void object_notice_effect(object_type *o_ptr) { if (object_add_ident_flags(o_ptr, IDENT_EFFECT)) object_check_for_ident(o_ptr); /* noticing an effect gains awareness */ if (!object_flavor_is_aware(o_ptr)) object_flavor_aware(o_ptr); }
/* * Notice the ego on an ego item. */ void object_notice_ego(object_type *o_ptr) { ego_item_type *e_ptr; bitflag learned_flags[OF_SIZE]; bitflag xtra_flags[OF_SIZE]; if (!o_ptr->name2) return; e_ptr = &e_info[o_ptr->name2]; /* XXX Eddie print a message on notice ego if not already noticed? */ /* XXX Eddie should we do something about everseen of egos here? */ /* Learn ego flags */ of_union(o_ptr->known_flags, e_ptr->flags); /* Learn all flags except random abilities */ of_setall(learned_flags); switch (e_ptr->xtra) { case OBJECT_XTRA_TYPE_NONE: break; case OBJECT_XTRA_TYPE_SUSTAIN: set_ego_xtra_sustain(xtra_flags); of_diff(learned_flags, xtra_flags); break; case OBJECT_XTRA_TYPE_RESIST: set_ego_xtra_resist(xtra_flags); of_diff(learned_flags, xtra_flags); break; case OBJECT_XTRA_TYPE_POWER: set_ego_xtra_power(xtra_flags); of_diff(learned_flags, xtra_flags); break; default: assert(0); } of_union(o_ptr->known_flags, learned_flags); if (object_add_ident_flags(o_ptr, IDENT_NAME)) { /* if you know the ego, you know which it is of excellent or splendid */ object_notice_sensing(o_ptr); object_check_for_ident(o_ptr); } }
/* * Mark an object as sensed. */ void object_notice_sensing(object_type *o_ptr) { artifact_type *a_ptr = artifact_of(o_ptr); if (object_was_sensed(o_ptr)) return; if (a_ptr) { a_ptr->seen = a_ptr->everseen = TRUE; o_ptr->ident |= IDENT_NAME; } object_notice_curses(o_ptr); if (object_add_ident_flags(o_ptr, IDENT_SENSE)) object_check_for_ident(o_ptr); }
/** * Mark as object as fully known, a.k.a identified. * Mark as object as fully known, a.k.a identified. * * \param o_ptr is the object to mark as identified */ void object_notice_everything(object_type *o_ptr) { artifact_type *a_ptr = artifact_of(o_ptr); /* The object is "empty" */ o_ptr->ident &= ~(IDENT_EMPTY); /* Mark as known */ object_flavor_aware(o_ptr); object_add_ident_flags(o_ptr, IDENTS_SET_BY_IDENTIFY); /* Artifact has now been seen */ if (a_ptr && !(o_ptr->ident & IDENT_FAKE)) { a_ptr->seen = a_ptr->everseen = TRUE; history_add_artifact(o_ptr->name1, TRUE, TRUE); } /* Know all flags there are to be known */ object_know_all_flags(o_ptr); }
static void object_notice_defence_plusses(object_type *o_ptr) { if (!o_ptr->k_idx) return; if (object_defence_plusses_are_visible(o_ptr)) return; if (object_add_ident_flags(o_ptr, IDENT_DEFENCE)) object_check_for_ident(o_ptr); if (o_ptr->ac || o_ptr->to_a) { char o_name[80]; object_desc(o_name, sizeof(o_name), o_ptr, ODESC_BASE); message_format(MSG_PSEUDOID, 0, "You know more about the %s you are wearing.", o_name); } p_ptr->update |= (PU_BONUS); event_signal(EVENT_INVENTORY); event_signal(EVENT_EQUIPMENT); }
/** * Notice that an object is indestructible. */ void object_notice_indestructible(object_type *o_ptr) { if (object_add_ident_flags(o_ptr, IDENT_INDESTRUCT)) object_check_for_ident(o_ptr); }
/* XXX Eddie should messages be adhoc all over the place? perhaps the main * loop should check for change in inventory/wieldeds and all messages be * printed from one place */ void object_notice_on_wield(object_type *o_ptr) { bitflag f[OF_SIZE], obvious_mask[OF_SIZE]; bool obvious = FALSE; const slay_t *s_ptr; flags_init(obvious_mask, OF_SIZE, OF_OBVIOUS_MASK, FLAG_END); /* Save time of wield for later */ object_last_wield = turn; /* Only deal with un-ID'd items */ if (object_is_known(o_ptr)) return; /* Wear it */ object_flavor_tried(o_ptr); if (object_add_ident_flags(o_ptr, IDENT_WORN)) object_check_for_ident(o_ptr); if (obj_is_light(o_ptr) && ego_item_p(o_ptr)) object_notice_ego(o_ptr); if (object_flavor_is_aware(o_ptr) && easy_know(o_ptr)) { object_notice_everything(o_ptr); return; } /* Automatically sense artifacts upon wield */ object_sense_artifact(o_ptr); /* Note artifacts when found */ if (artifact_p(o_ptr)) history_add_artifact(o_ptr->name1, object_is_known(o_ptr), TRUE); /* special case FA, needed at least for mages wielding gloves */ if (object_FA_would_be_obvious(o_ptr)) of_on(obvious_mask, OF_FREE_ACT); /* Learn about obvious flags */ of_union(o_ptr->known_flags, obvious_mask); /* Extract the flags */ object_flags(o_ptr, f); /* Find obvious things (disregarding curses) */ flags_clear(obvious_mask, OF_SIZE, OF_CURSE_MASK, FLAG_END); if (of_is_inter(f, obvious_mask)) obvious = TRUE; flags_init(obvious_mask, OF_SIZE, OF_OBVIOUS_MASK, FLAG_END); /* XXX Eddie should these next NOT call object_check_for_ident due to worries about repairing? */ /* XXX Eddie this is a small hack, but jewelry with anything noticeable really is obvious */ /* XXX Eddie learn =soulkeeping vs =bodykeeping when notice sustain_str */ if (object_is_jewelry(o_ptr)) { /* Learn the flavor of jewelry with obvious flags */ if (EASY_LEARN && obvious) object_flavor_aware(o_ptr); /* Learn all flags on any aware non-artifact jewelry */ if (object_flavor_is_aware(o_ptr) && !artifact_p(o_ptr)) object_know_all_flags(o_ptr); } object_check_for_ident(o_ptr); if (!obvious) return; /* Messages */ for (s_ptr = slay_table; s_ptr->slay_flag; s_ptr++) { if (of_has(f, s_ptr->slay_flag) && s_ptr->brand) { char o_name[40]; object_desc(o_name, sizeof(o_name), o_ptr, ODESC_BASE); msg_format("Your %s %s!", o_name, s_ptr->active_verb); } } /* XXX Eddie need to add stealth here, also need to assert/double-check everything is covered */ if (of_has(f, OF_STR)) msg_format("You feel %s!", o_ptr->pval > 0 ? "stronger" : "weaker"); if (of_has(f, OF_INT)) msg_format("You feel %s!", o_ptr->pval > 0 ? "smarter" : "more stupid"); if (of_has(f, OF_WIS)) msg_format("You feel %s!", o_ptr->pval > 0 ? "wiser" : "more naive"); if (of_has(f, OF_DEX)) msg_format("You feel %s!", o_ptr->pval > 0 ? "more dextrous" : "clumsier"); if (of_has(f, OF_CON)) msg_format("You feel %s!", o_ptr->pval > 0 ? "healthier" : "sicklier"); if (of_has(f, OF_CHR)) msg_format("You feel %s!", o_ptr->pval > 0 ? "cuter" : "uglier"); if (of_has(f, OF_SPEED)) msg_format("You feel strangely %s.", o_ptr->pval > 0 ? "quick" : "sluggish"); if (flags_test(f, OF_SIZE, OF_BLOWS, OF_SHOTS, FLAG_END)) msg_format("Your hands %s", o_ptr->pval > 0 ? "tingle!" : "ache."); if (of_has(f, OF_INFRA)) msg_format("Your eyes tingle."); if (of_has(f, OF_LIGHT)) msg_print("It glows!"); if (of_has(f, OF_TELEPATHY)) msg_print("Your mind feels strangely sharper!"); /* WARNING -- masking f by obvious mask -- this should be at the end of this function */ flags_mask(f, OF_SIZE, OF_OBVIOUS_MASK, FLAG_END); /* learn the ego on any obvious brand or slay */ if (EASY_LEARN && ego_item_p(o_ptr) && obvious && flags_test(f, OF_SIZE, OF_ALL_SLAY_MASK, FLAG_END)) object_notice_ego(o_ptr); /* Remember the flags */ object_notice_sensing(o_ptr); /* XXX Eddie should we check_for_ident here? */ }
/* XXX Eddie perhaps some stuff from do_cmd_fire and do_cmd_throw should be moved here */ void object_notice_on_firing(object_type *o_ptr) { if (object_add_ident_flags(o_ptr, IDENT_FIRED)) object_check_for_ident(o_ptr); }