/** * Describe charges or charging status for re-usable items with magic effects */ static size_t obj_desc_charges(const struct object *obj, char *buf, size_t max, size_t end, int mode) { bool aware = object_flavor_is_aware(obj) || (mode & ODESC_STORE); /* Wands and Staffs have charges */ if (aware && tval_can_have_charges(obj)) strnfcat(buf, max, &end, " (%d charge%s)", obj->pval, PLURAL(obj->pval)); /* Charging things */ else if (obj->timeout > 0) { if (tval_is_rod(obj) && obj->number > 1) { strnfcat(buf, max, &end, " (%d charging)", number_charging(obj)); } /* Artifacts, single rods */ else if (!(tval_is_light(obj) && !obj->artifact)) { strnfcat(buf, max, &end, " (charging)"); } } return end; }
/** * Recharge activatable objects in the player's equipment * and rods in the inventory and on the ground. */ static void recharge_objects(void) { int i; bool discharged_stack; struct object *obj; /* Recharge carried gear */ for (obj = player->gear; obj; obj = obj->next) { /* Skip non-objects */ assert(obj->kind); /* Recharge equipment */ if (object_is_equipped(player->body, obj)) { /* Recharge activatable objects */ if (recharge_timeout(obj)) { /* Message if an item recharged */ recharged_notice(obj, true); /* Window stuff */ player->upkeep->redraw |= (PR_EQUIP); } } else { /* Recharge the inventory */ discharged_stack = (number_charging(obj) == obj->number) ? true : false; /* Recharge rods, and update if any rods are recharged */ if (tval_can_have_timeout(obj) && recharge_timeout(obj)) { /* Entire stack is recharged */ if (obj->timeout == 0) recharged_notice(obj, true); /* Previously exhausted stack has acquired a charge */ else if (discharged_stack) recharged_notice(obj, false); /* Combine pack */ player->upkeep->notice |= (PN_COMBINE); /* Redraw stuff */ player->upkeep->redraw |= (PR_INVEN); } } } /* Recharge other level objects */ for (i = 1; i < cave->obj_max; i++) { obj = cave->objects[i]; if (!obj) continue; /* Recharge rods */ if (tval_can_have_timeout(obj)) recharge_timeout(obj); } }