package org.mafagafogigante.dungeon.entity.creatures;
import org.mafagafogigante.dungeon.entity.items.Item;
import org.mafagafogigante.dungeon.game.World;
import org.mafagafogigante.dungeon.logging.DungeonLogger;
import org.jetbrains.annotations.NotNull;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
* This class is a component that enables item dropping once in a lifetime of a Creature.
*/
class Dropper implements Serializable {
private final Creature creature;
private final List<Drop> dropList;
private final List<Item> droppedItemsList = new ArrayList<>();
private boolean hasAlreadyCalledDropEverything = false;
public Dropper(Creature creature, List<Drop> dropList) {
this.creature = creature;
this.dropList = dropList;
}
@NotNull
List<Item> getDroppedItemsList() {
return droppedItemsList;
}
/**
* Drops everything that is in the Creature's inventory on the ground. Also rolls for each drop law and creates the
* items that must be created.
*/
public void dropEverything() {
if (!hasAlreadyCalledDropEverything) {
hasAlreadyCalledDropEverything = true;
dropInventory();
dropVariableDrops();
} else {
DungeonLogger.warning("Called Dropper.dropEverything more than once in " + toString() + ". Ignored this call.");
}
}
private void dropInventory() {
for (Item item : new ArrayList<>(creature.getInventory().getItems())) {
creature.dropItem(item);
getDroppedItemsList().add(item);
}
}
private void dropVariableDrops() {
final World world = creature.getLocation().getWorld();
for (Drop drop : dropList) {
if (drop.rollForDrop()) {
if (world.getItemFactory().canMakeItem(drop.getItemId())) {
Item item = world.getItemFactory().makeItem(drop.getItemId(), world.getWorldDate());
creature.getLocation().addItem(item);
getDroppedItemsList().add(item);
}
}
}
}
@Override
public String toString() {
return "Dropper{" +
"creature=" + creature +
", dropList=" + dropList +
", droppedItemsList=" + droppedItemsList +
'}';
}
}