package org.mafagafogigante.dungeon.entity.creatures;
import org.mafagafogigante.dungeon.entity.Luminosity;
import org.mafagafogigante.dungeon.entity.Preset;
import org.mafagafogigante.dungeon.entity.TagSet;
import org.mafagafogigante.dungeon.entity.Weight;
import org.mafagafogigante.dungeon.entity.creatures.Creature.Tag;
import org.mafagafogigante.dungeon.game.Id;
import org.mafagafogigante.dungeon.game.Name;
import org.mafagafogigante.dungeon.logging.DungeonLogger;
import org.mafagafogigante.dungeon.util.Percentage;
import java.io.Serializable;
import java.util.List;
/**
* CreaturePreset class that stores the information that the CreatureFactory uses to produce creatures.
*/
public final class CreaturePreset implements Preset, Serializable {
private TagSet<Tag> tagSet = TagSet.makeEmptyTagSet(Creature.Tag.class);
private Id id;
private String type;
private Name name;
private Weight weight;
private int health;
private int attack;
private AttackAlgorithmId attackAlgorithmId;
private List<Id> items;
private List<Drop> dropList;
private Percentage visibility;
private Luminosity luminosity = Luminosity.ZERO;
private Id weaponId;
private int inventoryItemLimit;
private double inventoryWeightLimit;
/**
* Ensures that an integer value is greater than or equal to a provided minimum. If it is not, returns the minimum and
* logs a warning.
*
* @param value the original value
* @param minimum the minimum acceptable value
* @param attributeName the name of the attribute this value represents (used for logging)
* @return an integer i such that i >= minimum
*/
private static int validate(int value, int minimum, String attributeName) {
if (value >= minimum) {
return value;
} else {
String format = "Attempted to set %d to %s in CreaturePreset. Using %d.";
DungeonLogger.warning(String.format(format, value, attributeName, minimum));
return minimum;
}
}
TagSet<Creature.Tag> getTagSet() {
return tagSet;
}
public void setTagSet(TagSet<Creature.Tag> tagSet) {
this.tagSet = tagSet;
}
public boolean hasTag(Creature.Tag tag) {
return tagSet.hasTag(tag);
}
public Id getId() {
return id;
}
public void setId(Id id) {
this.id = id;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public Name getName() {
return name;
}
public void setName(Name name) {
this.name = name;
}
public Weight getWeight() {
return weight;
}
public void setWeight(Weight weight) {
this.weight = weight;
}
public int getHealth() {
return health;
}
public void setHealth(int health) {
health = validate(health, 1, "health");
this.health = health;
}
public int getAttack() {
return attack;
}
public void setAttack(int attack) {
attack = validate(attack, 0, "attack");
this.attack = attack;
}
public AttackAlgorithmId getAttackAlgorithmId() {
return attackAlgorithmId;
}
public void setAttackAlgorithmId(AttackAlgorithmId attackAlgorithmId) {
this.attackAlgorithmId = attackAlgorithmId;
}
public List<Id> getItems() {
return items;
}
public void setItems(List<Id> items) {
this.items = items;
}
public List<Drop> getDropList() {
return dropList;
}
public void setDropList(List<Drop> dropList) {
this.dropList = dropList;
}
public Percentage getVisibility() {
return visibility;
}
public void setVisibility(Percentage visibility) {
this.visibility = visibility;
}
public Luminosity getLuminosity() {
return luminosity;
}
public void setLuminosity(Luminosity luminosity) {
this.luminosity = luminosity;
}
public Id getWeaponId() {
return weaponId;
}
public void setWeaponId(Id weaponId) {
this.weaponId = weaponId;
}
public int getInventoryItemLimit() {
return inventoryItemLimit;
}
public void setInventoryItemLimit(int inventoryItemLimit) {
this.inventoryItemLimit = inventoryItemLimit;
}
public double getInventoryWeightLimit() {
return inventoryWeightLimit;
}
public void setInventoryWeightLimit(double inventoryWeightLimit) {
this.inventoryWeightLimit = inventoryWeightLimit;
}
}