mourning-ember / src / main / java / dev / llan / model / board / pathfinding / Path.java
Path.java
Raw
package dev.llan.model.board.pathfinding;

import dev.llan.model.board.Grid;
import dev.llan.model.board.Point;

import java.util.ArrayList;
import java.util.List;

public class Path implements Cloneable {
  private final List<Point> path;
  private final List<Double> aggregateCost;

  public Path() {
    path = new ArrayList<>();
    aggregateCost = new ArrayList<>();
  }

  public void removeFirst() {
    path.removeFirst();
    double cost = aggregateCost.removeFirst();
    aggregateCost.replaceAll(val -> val - cost);
  }

  public Point getFirst() {
    return path.getFirst();
  }

  public boolean isEmpty() {
    return path.isEmpty();
  }

  void addFirst(Point point) {
    path.addFirst(point);
  }

  public Point getEndpoint() {
    return path.getLast();
  }

  void calculateCosts(Point start, Grid grid) {
    double sum = 0.0;
    Point current = start;

    for(Point point : path) {
      sum += grid.getMovementCost(point, current);
      aggregateCost.add(sum);
      current = point;
    }

    assert aggregateCost.size() == path.size();
  }

  public List<Double> getAggregateCost() {
    return aggregateCost;
  }

  public int getPathSize() {
    return path.size();
  }

  public List<Point> getPath() {
    return path;
  }

  @Override
  public Path clone() {
    Path clone = new Path();
    for(Point point : this.path) {
      Point clonedPoint = point.clone();
      clone.path.add(clonedPoint);
    }

    for(double val : this.aggregateCost) {
      clone.aggregateCost.add(val);
    }

    return clone;
  }
}