package dev.llan.model.board;
import dev.llan.model.pieces.Entity;
import dev.llan.model.pieces.inanimates.Inanimate;
import dev.llan.model.pieces.inanimates.Obstacle;
import javafx.scene.image.Image;
import java.util.Optional;
public class Tile implements Cloneable {
public enum TileType {
VACANT,
INTERACTABLE,
UNMOVABLE,
OCCUPIED
}
private final Point position;
private TileType type;
private DisplayType displayType;
private boolean visible = false;
private boolean highlighted = false;
private Optional<Entity> entity = Optional.empty();
private Optional<Inanimate> inanimate = Optional.empty();
private double terrainCost = 1.0;
public Tile(Point position, TileType type) {
this.position = position;
this.type = type;
displayType = DisplayType.NONE;
}
public Optional<Entity> getEntity() {
return this.entity;
}
public void addEntity(Entity entity) {
this.type = TileType.OCCUPIED;
this.entity = Optional.of(entity);
}
public void removeEntity() {
this.type = TileType.VACANT;
this.entity = Optional.empty();
}
public void addInanimate(Inanimate inanimate) {
if (inanimate instanceof Obstacle) {
this.type = TileType.UNMOVABLE;
this.inanimate = Optional.empty();
return;
}
this.type = TileType.INTERACTABLE;
this.inanimate = Optional.of(inanimate);
}
public void disableInanimate() {
this.type = TileType.OCCUPIED;
}
public void removeInanimate() {
this.type = TileType.VACANT;
this.inanimate = Optional.empty();
}
public Optional<Inanimate> getInanimate() {
return this.inanimate;
}
public void setVisible(boolean visible) {
this.visible = visible;
}
public boolean isVisible() {
return visible;
}
public void setHighlighted(boolean highlighted) {
this.highlighted = highlighted;
}
public boolean isHighlighted() {
return highlighted;
}
public double getTerrainCost() {
return terrainCost;
}
public TileType getType() {
return type;
}
public void setType(TileType type) {
this.type = type;
}
public Image getIcon() {
return displayType.getIcon();
}
public void setDisplayType(DisplayType displayType) {
this.displayType = displayType;
}
public Point getPosition() {
return position;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("Tile{");
sb.append("position=").append(position);
sb.append(", type=").append(type);
sb.append(", visible=").append(visible);
sb.append(", entity=").append(entity);
sb.append(", inanimate=").append(inanimate);
sb.append(", terrainCost=").append(terrainCost);
sb.append('}');
return sb.toString();
}
@Override
protected Tile clone() {
Tile clone = new Tile(this.position.clone(), this.type);
clone.visible = this.visible;
clone.terrainCost = this.terrainCost;
clone.displayType = this.displayType;
clone.highlighted = this.highlighted;
return clone;
}
}