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 = Optional.empty(); private Optional 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 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 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; } }