mourning-ember / src / main / java / dev / llan / model / board / Tile.java
Tile.java
Raw
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;
  }
}