/* * Describe immunities granted by an object. */ static bool describe_immune(textblock *tb, const bitflag flags[OF_SIZE]) { const char *i_descs[N_ELEMENTS(immunity_flags)]; const char *r_descs[N_ELEMENTS(resist_flags)]; const char *p_descs[N_ELEMENTS(protect_flags)]; const char *v_descs[N_ELEMENTS(vuln_flags)]; size_t count; bool prev = FALSE; /* Immunities */ count = info_collect(tb, immunity_flags, N_ELEMENTS(immunity_flags), flags, i_descs); if (count) { textblock_append(tb, "Provides immunity to "); info_out_list(tb, i_descs, count); prev = TRUE; } /* Resistances */ count = info_collect(tb, resist_flags, N_ELEMENTS(resist_flags), flags, r_descs); if (count) { textblock_append(tb, "Provides resistance to "); info_out_list(tb, r_descs, count); prev = TRUE; } /* Protections */ count = info_collect(tb, protect_flags, N_ELEMENTS(protect_flags), flags, p_descs); if (count) { textblock_append(tb, "Provides protection from "); info_out_list(tb, p_descs, count); prev = TRUE; } /* Vulnerabilities */ count = info_collect(tb, vuln_flags, N_ELEMENTS(vuln_flags), flags, v_descs); if (count) { textblock_append(tb, "Makes you vulnerable to "); info_out_list(tb, v_descs, count); prev = TRUE; } return prev; }
/* * Describe stat sustains. */ static bool describe_sustains(textblock *tb, const bitflag flags[OF_SIZE]) { const char *descs[N_ELEMENTS(sustain_flags)]; size_t count = info_collect(tb, sustain_flags, N_ELEMENTS(sustain_flags), flags, descs); if (!count) return FALSE; textblock_append(tb, "Sustains "); info_out_list(tb, descs, count); return TRUE; }
/* * Describe 'ignores' of an object. */ static bool describe_ignores(textblock *tb, const bitflag flags[OF_SIZE]) { const char *descs[N_ELEMENTS(ignore_flags)]; size_t count = info_collect(tb, ignore_flags, N_ELEMENTS(ignore_flags), flags, descs); if (!count) return FALSE; textblock_append(tb, "Cannot be harmed by "); info_out_list(tb, descs, count); return TRUE; }
/* * Describe 'ignores' of an object. */ static bool describe_ignores(textblock * tb, const object_type * o_ptr, oinfo_detail_t mode) { bool full = mode & OINFO_FULL; const char *descs[N_ELEMENTS(ignore_flags)]; size_t count = info_collect(ignore_flags, N_ELEMENTS(ignore_flags), full ? o_ptr->flags_obj : o_ptr->id_obj, descs); if (!count) return FALSE; textblock_append(tb, "Cannot be harmed by "); info_out_list(tb, descs, count); return TRUE; }
/* * Describe stat modifications. */ static bool describe_stats(textblock *tb, const object_type *o_ptr, bitflag flags[MAX_PVALS][OF_SIZE], oinfo_detail_t mode) { const char *descs[N_ELEMENTS(pval_flags)]; size_t count, i; bool full = mode & OINFO_FULL; bool dummy = mode & OINFO_DUMMY; bool search = FALSE; if (!o_ptr->num_pvals && !dummy) return FALSE; for (i = 0; i < o_ptr->num_pvals; i++) { count = info_collect(tb, pval_flags, N_ELEMENTS(pval_flags), flags[i], descs); if (count) { if ((object_this_pval_is_visible(o_ptr, i) || full) && !dummy) textblock_append_c(tb, (o_ptr->pval[i] > 0) ? TERM_L_GREEN : TERM_RED, "%+i ", o_ptr->pval[i]); else textblock_append(tb, "Affects your "); info_out_list(tb, descs, count); } if (of_has(flags[i], OF_SEARCH)) search = TRUE; } if (search) { if ((object_this_pval_is_visible(o_ptr, which_pval(o_ptr, OF_SEARCH)) || full) && !dummy) { textblock_append_c(tb, (o_ptr->pval[which_pval(o_ptr, OF_SEARCH)] > 0) ? TERM_L_GREEN : TERM_RED, "%+i%% ", o_ptr->pval[which_pval(o_ptr, OF_SEARCH)] * 5); textblock_append(tb, "to searching.\n"); } else if (count) textblock_append(tb, "Also affects your searching skill.\n"); else textblock_append(tb, "Affects your searching skill.\n"); } return TRUE; }
/* * Describe stat sustains. */ static bool describe_sustains(textblock *tb, const object_type *o_ptr, oinfo_detail_t mode) { bool full = mode & OINFO_FULL; const char *descs[N_ELEMENTS(sustain_flags)]; size_t count = info_collect(sustain_flags, N_ELEMENTS(sustain_flags), full ? o_ptr->flags_obj : o_ptr->id_obj, descs); if (!count) return FALSE; if (count == 6) textblock_append(tb, "It sustains all your stats. "); else { textblock_append(tb, "Sustains "); info_out_list(tb, descs, count); } return TRUE; }