/** * Describes item `o_ptr` into buffer `buf` of size `max`. * * ODESC_PREFIX prepends a 'the', 'a' or number * ODESC_BASE results in a base description. * ODESC_COMBAT will add to-hit, to-dam and AC info. * ODESC_EXTRA will add pval/charge/inscription/squelch info. * ODESC_PLURAL will pluralise regardless of the number in the stack. * ODESC_STORE turns off squelch markers, for in-store display. * ODESC_SPOIL treats the object as fully identified. * * Setting 'prefix' to TRUE prepends a 'the', 'a' or the number in the stack, * respectively. * * \returns The number of bytes used of the buffer. */ size_t object_desc(char *buf, size_t max, const object_type *o_ptr, odesc_detail_t mode) { object_kind *k_ptr = &k_info[o_ptr->k_idx]; bool prefix = mode & ODESC_PREFIX; bool spoil = (mode & ODESC_SPOIL); bool known = object_is_known(o_ptr) || (o_ptr->ident & IDENT_STORE) || spoil; size_t end = 0; /* We've seen it at least once now we're aware of it */ if (known && o_ptr->name2) e_info[o_ptr->name2].everseen = TRUE; /*** Some things get really simple descriptions ***/ if (o_ptr->tval == TV_GOLD) return strnfmt(buf, max, "%d gold pieces worth of %s%s", o_ptr->pval, k_name + k_ptr->name, squelch_item_ok(o_ptr) ? " {squelch}" : ""); else if (!o_ptr->tval) return strnfmt(buf, max, "(nothing)"); /** Construct the name **/ /* Copy the base name to the buffer */ end = obj_desc_name(buf, max, end, o_ptr, prefix, mode, spoil); if (mode & ODESC_COMBAT) { if (o_ptr->tval == TV_CHEST) end = obj_desc_chest(o_ptr, buf, max, end); else if (o_ptr->tval == TV_LIGHT) end = obj_desc_light(o_ptr, buf, max, end); end = obj_desc_combat(o_ptr, buf, max, end, spoil); } if (mode & ODESC_EXTRA) { if (spoil || object_pval_is_visible(o_ptr)) end = obj_desc_pval(o_ptr, buf, max, end); end = obj_desc_charges(o_ptr, buf, max, end); if (mode & ODESC_STORE) { end = obj_desc_aware(o_ptr, buf, max, end); } else end = obj_desc_inscrip(o_ptr, buf, max, end); } return end; }
/* * Creates a description of the item "o_ptr", and stores it in "buf". * * The given "buf" should be at least 80 chars long to hold the longest * possible description, which can get pretty long, including inscriptions, * such as: * "no more Maces of Disruption (Defender) (+10,+10) [+5] (+3 to stealth)". * * Describes item `o_ptr` into buffer `buf` of size `max`. * * ODESC_PREFIX prepends a 'the', 'a' or number * ODESC_BASE results in a base description. * ODESC_COMBAT will add to-hit, to-dam and AC info. * ODESC_EXTRA will add pval/charge/inscription/squelch info. * ODESC_PLURAL will pluralise regardless of the number in the stack. * ODESC_STORE turns off squelch markers, for in-store display. * ODESC_SPOIL treats the object as fully identified. * * Setting 'prefix' to TRUE prepends a 'the', 'a' or the number in the stack, * respectively. * * \returns The number of bytes used of the buffer. */ size_t object_desc(char *buf, size_t max, const object_type *o_ptr, byte mode) { bool prefix = mode & ODESC_PREFIX; bool spoil = (mode & ODESC_SPOIL); size_t end = 0; bool aware; bool known; u32b f1, f2, f3, fn; object_kind *k_ptr = &k_info[o_ptr->k_idx]; /* Extract some flags */ object_flags(o_ptr, &f1, &f2, &f3, &fn); /* See if the object is "aware" */ aware = (object_aware_p(o_ptr) ? TRUE : FALSE); /* See if the object is "known" */ known = (object_known_p(o_ptr) ? TRUE : FALSE); /* Object is in the inventory of a store */ if (o_ptr->ident & IDENT_STORE) { /* Pretend known and aware */ aware = TRUE; known = TRUE; } /* Player has now seen the item * * This code must be exactly here to properly handle objects in * stores (fake assignment to "aware", see above) and unaware objects * in the dungeon. */ if (aware) k_ptr->everseen = TRUE; /* We've seen it at least once now we're aware of it */ if (known && o_ptr->ego_num) e_info[o_ptr->ego_num].everseen = TRUE; /*** Some things get really simple descriptions ***/ if (o_ptr->tval == TV_GOLD) { return strnfmt(buf, max, "%d gold pieces worth of %s", o_ptr->pval, k_name + k_ptr->name); } else if (!o_ptr->tval) { return strnfmt(buf, max, "(nothing)"); } /* Copy the base name to the buffer */ end = obj_desc_name(buf, max, end, o_ptr, prefix, mode, spoil); if (mode & ODESC_COMBAT) { if (o_ptr->tval == TV_CHEST) end = obj_desc_chest(o_ptr, buf, max, end); else if (o_ptr->tval == TV_LIGHT) end = obj_desc_light(o_ptr, buf, max, end); end = obj_desc_combat(o_ptr, buf, max, end, spoil); } if (mode & ODESC_EXTRA) { if (spoil || known) end = obj_desc_pval(o_ptr, buf, max, end); end = obj_desc_charges(o_ptr, buf, max, end); end = obj_desc_inscrip(o_ptr, buf, max, end); } return end; }
/** * Describes item `o_ptr` into buffer `buf` of size `max`. * * ODESC_PREFIX prepends a 'the', 'a' or number * ODESC_BASE results in a base description. * ODESC_COMBAT will add to-hit, to-dam and AC info. * ODESC_EXTRA will add pval/charge/inscription/squelch info. * ODESC_PLURAL will pluralise regardless of the number in the stack. * ODESC_STORE turns off squelch markers, for in-store display. * ODESC_SPOIL treats the object as fully identified. * * Setting 'prefix' to TRUE prepends a 'the', 'a' or the number in the stack, * respectively. * * \returns The number of bytes used of the buffer. */ size_t object_desc(char *buf, size_t max, const object_type *o_ptr, odesc_detail_t mode) { bool prefix = mode & ODESC_PREFIX; bool spoil = (mode & ODESC_SPOIL); bool known; size_t end = 0, i = 0; /* Simple description for null item */ if (!o_ptr->tval) return strnfmt(buf, max, "(nothing)"); known = object_is_known(o_ptr) || (o_ptr->ident & IDENT_STORE) || spoil; /* We've seen it at least once now we're aware of it */ if (known && o_ptr->ego && !spoil) o_ptr->ego->everseen = TRUE; /*** Some things get really simple descriptions ***/ if (o_ptr->marked == MARK_AWARE) { return strnfmt(buf, max, "an unknown item"); } if (o_ptr->tval == TV_GOLD) return strnfmt(buf, max, "%d gold pieces worth of %s%s", o_ptr->pval[DEFAULT_PVAL], o_ptr->kind->name, squelch_item_ok(o_ptr) ? " {squelch}" : ""); /** Construct the name **/ /* Copy the base name to the buffer */ end = obj_desc_name(buf, max, end, o_ptr, prefix, mode, spoil); if (mode & ODESC_COMBAT) { if (o_ptr->tval == TV_CHEST) end = obj_desc_chest(o_ptr, buf, max, end); else if (o_ptr->tval == TV_LIGHT) end = obj_desc_light(o_ptr, buf, max, end); end = obj_desc_combat(o_ptr, buf, max, end, spoil); } if (mode & ODESC_EXTRA) { for (i = 0; i < o_ptr->num_pvals; i++) if (spoil || object_this_pval_is_visible(o_ptr, i)) { end = obj_desc_pval(o_ptr, buf, max, end, spoil); break; } end = obj_desc_charges(o_ptr, buf, max, end); if (mode & ODESC_STORE) end = obj_desc_aware(o_ptr, buf, max, end); else end = obj_desc_inscrip(o_ptr, buf, max, end); } return end; }