예제 #1
0
파일: obj-gear.c 프로젝트: fe051/angband
/**
 * 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;
}
예제 #2
0
/**
 * 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);
	}
}