/** * Calculate how much of an item is can be carried in the inventory or quiver. * * Optionally only return a positive value if there is already a similar object. */ int inven_carry_num(const struct object *obj, bool stack) { struct object *gear_obj; int i, num_left = obj->number; /* Check for similarity */ if (stack) { for (gear_obj = player->gear; gear_obj; gear_obj = gear_obj->next) { /* Skip equipped items and non-objects */ if (object_is_equipped(player->body, gear_obj)) continue; if (!gear_obj) continue; /* Check if the two items can be combined */ if (object_stackable(gear_obj, obj, OSTACK_PACK)) break; } /* No similar object, so no stacking */ if (!gear_obj) return 0; } /* Free inventory slots, so there is definitely room */ if (pack_slots_used(player) < z_info->pack_size) return obj->number; /* Absorb as many as we can in the quiver */ num_left -= quiver_absorb_num(obj); /* See if we can add to a part full inventory slot */ for (i = 0; i < z_info->pack_size; i++) { struct object *inven_obj = player->upkeep->inven[i]; if (!inven_obj) continue; if (!object_stackable(inven_obj, obj, OSTACK_PACK)) continue; num_left -= z_info->stack_size - inven_obj->number; } /* Return the number we can absorb */ num_left = MAX(num_left, 0); return obj->number - num_left; }
/** * Calculate how much of an item is can be carried in the inventory or quiver. * * Optionally only return a positive value if there is already a similar object. */ int inven_carry_num(const struct object *obj, bool stack) { /* Check for similarity */ if (stack) { struct object *gear_obj; for (gear_obj = player->gear; gear_obj; gear_obj = gear_obj->next) { if (!object_is_equipped(player->body, gear_obj) && object_stackable(gear_obj, obj, OSTACK_PACK)) { break; } } /* No similar object, so no stacking */ if (!gear_obj) { return 0; } } /* Free inventory slots, so there is definitely room */ if (pack_slots_used(player) < z_info->pack_size) { return obj->number; } else { int i; /* Absorb as many as we can in the quiver */ int num_left = obj->number - quiver_absorb_num(obj); /* See if we can add to a part full inventory slot */ for (i = 0; i < z_info->pack_size; i++) { struct object *inven_obj = player->upkeep->inven[i]; if (inven_obj && object_stackable(inven_obj, obj, OSTACK_PACK)) { num_left -= inven_obj->kind->base->max_stack - inven_obj->number; } } /* Return the number we can absorb */ return obj->number - MAX(num_left, 0); } }