package org.mafagafogigante.dungeon.entity.items; import org.mafagafogigante.dungeon.entity.Weight; import org.mafagafogigante.dungeon.entity.creatures.Creature; import org.mafagafogigante.dungeon.logging.DungeonLogger; /** * The CreatureInventory class. */ public class CreatureInventory extends BaseInventory implements LimitedInventory { private final Creature owner; private final int itemLimit; private final Weight weightLimit; /** * Constructs a new CreatureInventory. */ public CreatureInventory(Creature owner, int itemLimit, double weightLimit) { this.owner = owner; this.itemLimit = itemLimit; this.weightLimit = Weight.newInstance(weightLimit); } @Override public int getItemLimit() { return itemLimit; } @Override public Weight getWeightLimit() { return weightLimit; } /** * Retrieves the sum of the weights of the individual items on this inventory. */ public Weight getWeight() { Weight sum = Weight.ZERO; for (Item item : getItems()) { sum = sum.add(item.getWeight()); } return sum; } /** * Attempts to add an Item to this Inventory. As a precondition, simulateItemAddition should return SUCCESSFUL. * * @param item the Item to be added, not null */ public void addItem(Item item) { if (simulateItemAddition(item) == SimulationResult.SUCCESSFUL) { items.add(item); item.setInventory(this); String format = "Added %s to the inventory of %s."; DungeonLogger.fine(String.format(format, item.getQualifiedName(), owner)); } else { throw new IllegalStateException("simulateItemAddition did not return SimulationResult.SUCCESSFUL."); } } /** * Simulates the addition of an Item to this CreatureInventory and returns the result. * * @param item the Item to be added, not null * @return a SimulationResult value */ public SimulationResult simulateItemAddition(Item item) { if (hasItem(item)) { // Check that the new item is not already in the inventory. DungeonLogger.warning("Tried to add an item to a CreatureInventory that already has it."); return SimulationResult.ALREADY_IN_THE_INVENTORY; } if (isFull()) { return SimulationResult.AMOUNT_LIMIT; } else if (willExceedWeightLimitAfterAdding(item)) { return SimulationResult.WEIGHT_LIMIT; } else { return SimulationResult.SUCCESSFUL; } } private boolean isFull() { return getItemCount() == getItemLimit(); } private boolean willExceedWeightLimitAfterAdding(Item item) { return getWeight().add(item.getWeight()).compareTo(getWeightLimit()) > 0; } /** * Removes an Item from the CreatureInventory, unequipping it if it is the currently equipped weapon. * * @param item the Item to be removed from the CreatureInventory */ public void removeItem(Item item) { if (owner.getWeapon() == item) { owner.unsetWeapon(); } items.remove(item); item.setInventory(null); String format = "Removed %s from the inventory of %s."; DungeonLogger.fine(String.format(format, item.getQualifiedName(), owner)); } public enum SimulationResult {ALREADY_IN_THE_INVENTORY, AMOUNT_LIMIT, WEIGHT_LIMIT, SUCCESSFUL} }