/** * Determine which equipment slot (if any) an item likes. The slot might (or * might not) be open, but it is a slot which the object could be equipped in. * * For items where multiple slots could work (e.g. rings), the function * will try to return an open slot if possible. */ int wield_slot(const struct object *obj) { /* Slot for equipment */ switch (obj->tval) { case TV_BOW: return slot_by_type(player, EQUIP_BOW, false); case TV_AMULET: return slot_by_type(player, EQUIP_AMULET, false); case TV_CLOAK: return slot_by_type(player, EQUIP_CLOAK, false); case TV_SHIELD: return slot_by_type(player, EQUIP_SHIELD, false); case TV_GLOVES: return slot_by_type(player, EQUIP_GLOVES, false); case TV_BOOTS: return slot_by_type(player, EQUIP_BOOTS, false); } if (tval_is_melee_weapon(obj)) return slot_by_type(player, EQUIP_WEAPON, false); else if (tval_is_ring(obj)) return slot_by_type(player, EQUIP_RING, false); else if (tval_is_light(obj)) return slot_by_type(player, EQUIP_LIGHT, false); else if (tval_is_body_armor(obj)) return slot_by_type(player, EQUIP_BODY_ARMOR, false); else if (tval_is_head_armor(obj)) return slot_by_type(player, EQUIP_HAT, false); /* No slot available */ return (-1); }
/** * Describe combat properties of an item - damage dice, to-hit, to-dam, armor * class, missile multipler */ static size_t obj_desc_combat(const struct object *obj, char *buf, size_t max, size_t end, bool spoil) { bitflag flags_known[OF_SIZE]; object_flags_known(obj, flags_known); if (kf_has(obj->kind->kind_flags, KF_SHOW_DICE)) { /* Only display the real damage dice if the combat stats are known */ if (spoil || object_attack_plusses_are_visible(obj)) strnfcat(buf, max, &end, " (%dd%d)", obj->dd, obj->ds); else strnfcat(buf, max, &end, " (%dd%d)", obj->kind->dd, obj->kind->ds); } if (kf_has(obj->kind->kind_flags, KF_SHOW_MULT)) { /* Display shooting power as part of the multiplier */ if ((obj->modifiers[OBJ_MOD_MIGHT] > 0) && (spoil || object_this_mod_is_visible(obj, OBJ_MOD_MIGHT))) strnfcat(buf, max, &end, " (x%d)", obj->pval + obj->modifiers[OBJ_MOD_MIGHT]); else strnfcat(buf, max, &end, " (x%d)", obj->pval); } /* Show weapon bonuses */ if (spoil || object_attack_plusses_are_visible(obj)) { if (tval_is_weapon(obj) || obj->to_d || obj->to_h) { /* Make an exception for body armor with only a to-hit penalty */ if (obj->to_h < 0 && obj->to_d == 0 && tval_is_body_armor(obj)) strnfcat(buf, max, &end, " (%+d)", obj->to_h); /* Otherwise, always use the full tuple */ else strnfcat(buf, max, &end, " (%+d,%+d)", obj->to_h, obj->to_d); } } /* Show armor bonuses */ if (spoil || object_defence_plusses_are_visible(obj)) { if (obj_desc_show_armor(obj)) strnfcat(buf, max, &end, " [%d,%+d]", obj->ac, obj->to_a); else if (obj->to_a) strnfcat(buf, max, &end, " [%+d]", obj->to_a); } else if (obj_desc_show_armor(obj)) strnfcat(buf, max, &end, " [%d]", object_was_sensed(obj) ? obj->ac : obj->kind->ac); return end; }