package games.strategy.engine.data; import java.util.Collections; import java.util.List; /** * A scripted or cheating Route, designed for use with Triggers and with units stranded in enemy territory, or other * situations where you * want the "end" to not be null. * If the Route only has a start, it will return the start when you call .end(), and it will return a length of 1 if the * length is really * zero. */ public class RouteScripted extends Route { private static final long serialVersionUID = 604474811874966546L; public RouteScripted() {} /** * Shameless cheating. Making a fake route, so as to handle battles properly without breaking battleTracker protected * status or * duplicating a zillion lines of code. * The End will return the Start, and the Length will be 1. */ public RouteScripted(final Territory terr) { super(terr); } public RouteScripted(final Territory start, final Territory... route) { super(start, route); } @Override public void add(final Territory t) { // maybe we don't check for loops? super.add(t); } @Override public int getMovementCost(final Unit u) { if (super.getMovementCost(u) <= 0) { return 1; } return super.getMovementCost(u); } @Override public int numberOfSteps() { if (super.numberOfSteps() <= 0) { return 1; } return super.numberOfSteps(); } @Override public List<Territory> getSteps() { if (numberOfSteps() <= 0) { return Collections.singletonList(getStart()); } return super.getSteps(); } @Override public Territory getEnd() { if (super.getEnd() == null) { return super.getStart(); } return super.getEnd(); } @Override public Territory getTerritoryAtStep(final int i) { try { if (super.getEnd() == null || super.getTerritoryAtStep(i) == null) { return super.getStart(); } } catch (final ArrayIndexOutOfBoundsException e) { return super.getStart(); } return super.getTerritoryAtStep(i); } @Override public boolean hasSteps() { return true; } @Override public boolean hasNoSteps() { return false; } @Override public boolean hasExactlyOneStep() { return numberOfSteps() <= 1; } }